perm filename DFTP.MAC[CSP,SYS]1 blob sn#434060 filedate 1979-04-14 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00058 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00010 00002	TITLE DFTP
C00019 00003	R1 R2 R3 R4 R5 R6 R7 R10 R11 R12 R13 R14 R15 R16 R17 X1 X2 X3 X4 IO BP FLAG UTIL STAK TCIO TCIBP TCIACB TCITLP TCITCC TCIPBP TCIPCC TCISBP TCISCC TCIMAC TCIMAN DCHOST DCSOKT DEFALO SIZBLK LBSIZE SBSIZE LHOST
C00022 00004	..SAVC ..SAVL ..SAVC ..REG ..REG ..SFLG ..REG ..SAVL ..REG ..CMCH ..CMWD ..CNUM ..IDX ..CMWD ..IDX ..IDX
C00027 00005	STLOC LSLOC WFLOC BSLOC FSLOC HLOC ERRBTS DCCHAN DDCHAN LFCHAN LDCHAN
C00030 00006	DFTP RENTER CMDNEW CMDCMD CMDM1 CMDM2 CMDM3
C00033 00007	CMDMC1 CMDMC2 CMDMC3
C00035 00008	CALO CALO1 CALO2 CATT CBIG CCHA CCON CCRE CDEL CDIR CDIR1 CDIR2 CDIR3 CDIRC CDIS CENA CEXA CEXA0 CEXP CGET CLIN CLIS CLIS1 CLIS2 CLIS3 CLISC1 CLISC2 CLOD CLOD1 CLOU Project CLOU1A CLOU1 CLOU2A CLOU2 CLOU4 CNOD CPUT CQUI CREM CREN CREN1 CREN2 CREN3 CRET CSOD CSTO CTER CTTR CUND CUTR CVER
C00045 00009	PATHNR PATHNP PATHNF PATHFR PATHFF PATHCT PATHCA PATHCC PATHLR PATHRL PATHAS PATHAD PATHAV PATHAC $PATH$ PAT$10 PAT$11 PAT$12 PAT$20 PAT$21 PAT$22 PAT$23 PAT$24 PAT$25
C00049 00010	P$I$AE P$I$DE P$I$SE P$I$TE P$I$PW P$I$CC P$I$CA P$I$CT P$I$EP P$I$VP P$IN P$ICHR P$ICHE P$ICHP P$ISA P$ISA1 P$ISA2 P$ISA3 P$ISD1 P$ISD2 P$ISD9 P$ISVS P$ISVN P$ISS P$IST P$IPON P$IPOF P$IBAD P$IREP P$IR01 P$IR02 P$IR03 P$IR04 P$IR05 P$IR06 P$IDEL P$ID00 P$ID01 P$ID02 P$ID03 P$IENR P$IEND P$IENL P$IENV P$IENC P$IENN P$IENT P$IENS P$IENZ
C00060 00011	P$PP P$PS2 P$PS1 P$PS3 P$PN P$PF P$PF0 P$PF1 P$PF2 P$PF3 P$PF4 P$PF5 P$PF6
C00063 00012	P$CP P$CPCX P$CPCT P$CPCA P$CPCC P$CPCE P$CPI P$CPI0 P$CPO P$CPQ P$CPS P$CPP P$CPE P$CPZ P$CPZ0
C00066 00013	P$LF P$LF1 P$LF3 P$LF2
C00068 00014	DALO DATT DBIG DBIG1 DBIG2 DBIG3
C00071 00015	DCHA DCHAD DCHAI DCHAI1 DCHA1A DCHAI2 DCHAI3 DCHAI4 DCHAI5 DCHAC DCHAC1 DCHAC2 DCHAC3 DCHAC4 DCHAI8
C00075 00016	DCON DCON1 DCON2 DCRE
C00076 00017	DDEL
C00078 00018	DDIR DDIRO1 DDIRO2 DDIRO3 DDIRO4 DDIRF DDIRF1 DDIRF2 DDIRF3 DD$D DD$T DD$T1 DD$T2 DD$V DD$V1 DD$V2 DD$V3
C00081 00019	DEXA DEXA1 DEXA2 DEXA3 DEXA4 DEXAE DEXA$ DEXA$1 DEXA$2 DEXA$0 DEXA$3 DEXA$4 DEXA$5 DEXA$6 DEXA$7 DEXA$8 DEXA$9
C00085 00020	DEXP DEXP1 DEXP2 DEXP3 DEXP4
C00088 00021	DGET DGET1 DGET2 DGET$ DGET3 DGET4 DGETE GET$F GET$E GET$D DLIN DLINI DLINE
C00091 00022	DLIS DLISO1 DLISO2 DLISO3 DLISI DLISN DLISD DLISE DL$T DL$T0 DL$V DL$VL DL$VN DL$VT DL$VT1 DL$VT2 DL$VE DL$P DL$P1 DL$P2 DL$P3 DL$P4 DL$NAM DL$NAN DL$NA1 DL$NA2 DL$NA3 DL$NIN DL$NI1 DL$NI2 DL$NI3 DL$NCN DL$NC1 DL$NON DL$NO1 DL$NO2 DL$NER
C00098 00023	DPUT DPUT1 DPUT2 DPUT3 DPUT4 DPUT$1 DPUT5 DPUT6 DPUT$2 DPUT7 DPUTE
C00102 00024	DREM DREM0
C00103 00025	DREN
C00106 00026	DUND
C00108 00027	D$INIT D$IN0 D$IN3 D$IN4 D$IN2 D$IND D$INP
C00112 00028	D$CON
C00113 00029	D$HEAD D$HET1 D$HET2 D$HET3 D$HET4 D$HET5 D$HEL1 D$HEL2 D$HEL3 D$HEL4 D$HEL5 D$HEL6 D$HEL7 D$HEL8 D$HEF1 D$HEF2 D$HEF3 D$HEF4 D$HED1
C00117 00030	D$OPEN D$OP01 D$OP02 D$OP03 D$OP04 D$OP05 D$OP06 D$OP07 D$OP08 D$OP09 D$OP10
C00120 00031	D$VER D$VER1 D$VER2 D$VER$ D$VERE D$VERN
C00126 00032	D$VEX
C00128 00033	D$W$F D$W$E D$W$V D$W$Q D$WITH D$WIT1 D$WIT2 D$WIT3
C00130 00034	NETSUM NETS1 NETS2 NETS3 NETRAT
C00132 00035	RENDER RENDSL RENDPM RENDFL RENDES RENDRR RENFIP RENFIL RENFIN RENFIS RENLIN RENLNL RENLIP RENLPL RENLPF RENLPP RENLPQ RENPRE RENPRP RENPRL DEATH
C00136 00036	$TAIN$ TAIN1 TAIN5 TAIN2 TAIN3 TAIN4
C00137 00037	$TCIN$ TCII01 TCICHR TCIC01 TCIC02 TCIC03 TCIC04 TCIC05 TCIC06 TCIC07 TCIC08 TCIC09 TCIC10 TCIBAD TCIREP TCIR01 TCIQUA TCIQ01 TCIQ02 TCIQ03 TCIDEL TCIENR TCIENN TCIEND TCIE01 TCIE02 TCIE03
C00145 00038	$TSIN$ TSICHR TSIBAD TSIREP TSIR01 TSIDEL TSIENR TSIEND
C00148 00039	$TNIN$ TNICHR TNIBAD TNIREP TNIR01 TNIDEL TNIENR TNIEND TNICAL
C00151 00040	DCNIN DCNIN1 DCNIN2
C00152 00041	$NOUT$ NOUT1 NOUT2 NOUT3
C00153 00042	GETFIL GETDAT GETD1 GETD2 GETD3 GETD4 NETEIT
C00156 00043	PUTFIL PUTDAT PUTD1 PUTD2A PUTD2B PUTD3 NETEOT
C00159 00044	EXAFIL EXAF5 EXAF6 EXAF0 EXAF1 EXAF2 EXAF3
C00162 00045	ICP ICPLUZ SUICID QUIT QUIT1 CLSCHK
C00167 00046	NETOI NETOI2 NETOO NETOO2 NETC
C00169 00047	NETMSG NETMS1 NETM1A NETMS2 NETMS3 NETMS4
C00171 00048	NETFFI NETFI1 NETFI4 NETFI2 NETFI5
C00172 00049	NUTMI NUTMO NUTMOB NUTMOL NUTMOO NUTDD NUTDDL NETDSI NETDSO NUTFB NUTFB1 NUTFB2
C00175 00050	LOCOI LOCOI2 LOCOO LOCOO1 LOCOO2 LOCC LOCS
C00177 00051	LOCFFI LOCFI1 LOCFI6 LOCFI2 LOCFI7 LOCFI8 LOCFI3 LOCFI9 LCFI12 LCFI10 LCFI11 LOCFI4 LOCFI5 LOCNFI LOCNI0 LOCNI1 LOCNI6 LOCNI7 LOCNI2 LOCNI8 LOCNI9 LCNI10 LCNI11 LOCNI3 LCNI12 LOCNI4 LCNI13
C00181 00052	LOCNFO LOCNO0
C00182 00053	LUTFN LUTFN1 LUTFN2 LUTFNT
C00184 00054	LUTDS LUTDS1 LUTDS2 LUTDS3 LUTDSI LUTDSS LUTDSD LUTDSE
C00186 00055	LUTTNS
C00188 00056	LUTTSN LUTTM
C00191 00057	OOPS IOERDD IOERLF
C00193 00058	CRLF RPAREN SEMI DCIBUF DCOBUF DDCHAS ZONKER DDIBUF DDOBUF LFIBUF LFOBUF ZONKEND XJOBFF LFIPPN LFILE LFCHAS LDIR LDCHAS LDIBUF LUTDSP LUTDSF EXABUF CONECB TERBLK STTBLK CMDMOD ANCHOR LOGIN% CONTEX OPENED OPENEM FLAGDD FLAGDE FLAGFE FLAGNN FLAGTT FLAGSM DEXA$L DEXA$P DEXA$S NBUF FBUF EBUF VBUF FSBUF ESBUF ABUF UBUF1 UBUF2 GBUF1 GBUF2 NTIME NSIZE NSUM TCIPCL TCIPLP TCIPNF STSIZ STBEG
C00197 ENDMK
C⊗;
TITLE DFTP

;     The DFTP program is arranged textually thus:
;          macro definitions
;          command input routines
;          command processing (Datacomputer interface) routines
;          I/O routines
;          data area
;     The DFTP program control structure is organized thus:
;          Initialization (S$INIT-D$INIT)
;          Main Command Loop (CMDCMD-TCIN)
;            Individualized Command Routines (C***)
;              Path Specification (PATH)
;                Path Input (P$IN)
;                Datacomputer Argument Preparation (P$PP)
;                Local File Name Preparation (P$LF)
;              Individualized Datacomputer Routines (D***)
;                Common Datacomputer Routines (D$**)
;                Datacomputer Synchronization (REN***)
;                Data Transfer (GET***,PUT***,NET***,LOC***)
;     S$INIT    performs    low-level    system    initialization,
;establishing (via ICP) network connections with the Datacomputer.
;D$INIT   initializes  the  Datacomputer  session,  attaching  and
;opening and connecting ports.
;     CMDCMD is the main loop point for command processing.   TCIN
;is  the  command  recognizer,  which  associates the command name
;given  with  the  proper   command   processing   routine.    The
;individualized  command  processing  routines  (CALO, CATT, CBIG,
;CCHA, CCON, CCRE, CDEL, CDIR, CEXA, CEXP, CGET, CLIS, CPUT, CREM,
;CREN, CRET, CSTO, CUND) call the path specification routine  PATH
;with  appropriate  flags  (constraining the path to be input) and
;then  call  their  own  individualized   Datacomputer   interface
;routines (DALO, DATT, etc.).
;     PATH processes paths.  It first inputs  the  path  from  the
;terminal  in  DFTP format via P$IN, then translates the path into
;components suitable for sending to the Datacomputer (NBUF --  the
;Datacomputer  pathname,  FBUF  --  the  file  name,  EBUF  -- the
;extension, VBUF -- the version) via P$PP,  and  finally  prepares
;the local file name (for PUT and GET) via P$LF.
;     The individualized Datacomputer command  interface  routines
;send  the  Datalanguage  and data appropriate for each command to
;the Datacomputer and process the  responses  and  data  returned.
;Aiding them are routines that send commonly required Datalanguage
;(D$CON,   D$OPEN,   D$VER,   D$VEX,  D$WITH)  and  routines  that
;synchronize  with  the  Datacomputer  by  handling  the   message
;prefixes and messages sent by it (RENDER, RENDEM, RENFIP, RENLIN,
;RENLIP,  RENPRE).   The  data transfer command interface routines
;(DGET and DPUT) also call the low-level  routines  that  actually
;move  the  data  between  the  network  and  local files (GETFIL,
;GETDAT, PUTFIL, PUTDAT) and that manage the  network  connections
;(NETOI,  NETOO,  NETC,  NETDSI, NETDSO, NETMSG, NETFFI) and local
;files (LOCOI, LOCOO, LOCC, LOCS, LOCFFI, LOCNFI, LOCNFO).
;     Primitive building blocks are the macros for  routine  entry
;and  exit  (BEGINR,  RETURN, RETN, EXIT, CALLR), the terminal I/O
;routines and macros  (TBIN,  TBOUT,  TSIN,  TSOUT,  TNIN,  TNOUT,
;TAIN),  and  the  Datacomputer  I/O  routines  and macros (DCBIN,
;DCBOUT, DCSOUT, DCNIN, DCNOUT).

; "<FILE"> FILE LIST(0,55,256),CAT,B=36
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),C=1
; 	    EXTENSION STRING(0,3,79),C=1
; 	    STATUS STRING(1),F=' '
; 	    CREATIONDATE STRING(1,18,79),F='?',C=1
; 	    SAVEDATE STRING(1,18,79),F='?',C=1
; 	    VERSION INTEGER
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	INDEX BYTE,V=I
; 	COUNT BYTE
; 	DATA STRING(0,497,500000),B=36,C=COUNT
; 	CHECKSUM BYTE
;     END;
;
; "<GET"> PORT LIST(0,500),B=36,P=EOF,CHECK
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(79),F=' ',D=0
; 	    EXTENSION STRING(79),F=' ',D=0
; 	    CREATIONDATE STRING(19),F=' ',D=0
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	COUNT BYTE
; 	DATA STRING(0,437,1000000),B=36,D=0
; 	CHECKSUM BYTE
;     END;
;
; "<PUT"> PORT LIST(0,500),B=36,P=EOF,CHECK
;     FILE STRUCTURE
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D=0
; 	    EXTENSION STRING(0,3,79),D=0
; 	    CREATIONDATE STRING(0,18,79),D=0
; 	    SAVEDATE STRING(0,18,79),D=0
; 	    VERSION INTEGER
; 	    LENGTH INTEGER
; 	    BYTESIZE INTEGER
; 	END
; 	COUNT BYTE
; 	DATA STRING(0,497,1000000),B=36,C=COUNT
; 	CHECKSUM BYTE
;     END;
;
; "<TERSE"> PORT LIST(0,500),P=EOF
;     FILE STRUCTURE,P=EOR
; 	PREFIX STRING(5),F=' '
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D='.'
; 	    EXTENSION STRING(0,3,79),D=';'
; 	    VERSION INTEGER(1,10),D='	'
; 	    LENGTH INTEGER(1,10),D='('
; 	    BYTESIZE INTEGER(1,10),D=')'
; 	END
;     END;
;
; "<VERBOSE"> PORT LIST(0,500),P=EOF
;     FILE STRUCTURE,P=EOR
; 	PREFIX STRING(5),F=' '
; 	HEADER STRUCTURE
; 	    FILENAME STRING(1,6,79),D='.'
; 	    EXTENSION STRING(0,3,79),D=';'
; 	    VERSION INTEGER(1,10),D=' '
; 	    STATUS STRING(1),D='	'
; 	    CREATIONDATE STRING(1,18,79),D=' '
; 	    SAVEDATE STRING(1,18,79),D=' '
; 	    LENGTH INTEGER(1,10),D='('
; 	    BYTESIZE INTEGER(1,10),D=')'
; 	END
;     END;
;R1 R2 R3 R4 R5 R6 R7 R10 R11 R12 R13 R14 R15 R16 R17 X1 X2 X3 X4 IO BP FLAG UTIL STAK TCIO TCIBP TCIACB TCITLP TCITCC TCIPBP TCIPCC TCISBP TCISCC TCIMAC TCIMAN DCHOST DCSOKT DEFALO SIZBLK LBSIZE SBSIZE LHOST

SUBTTL Switches, definitions, etc.

IF1,<PRINTX DFTP...>
IF2,<PRINTX ...is halfway>

; REGISTER DEFINITIONS

	R1==1
	R2==2
	R3==3
	R4==4
	R5==5
	R6==6
	R7==7
	R10==10
	R11==11
	R12==12
	R13==13
	R14==14
	R15==15
	R16==16
	R17==17

;	(SCRATCH REGISTERS)
	X1==1
	X2==2
	X3==3
	X4==4

;	(COMMONLY USED REGISTERS)
	IO==R5
	BP==R6
	FLAG==R15
	UTIL==R16
	STAK==R17

;	(TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
	TCIO==R2		; IO(REGISTER)
	TCIBP==R3		; B(YTE)P(OINTER)
	TCIACB==R4		; A(DDRESSOF)C(ONTROL)B(LOCK)
	TCITLP==R5		; T(RACE)L(IST)P(OINTER)
	TCITCC==R6		; T(RACE)C(OMMAND)C(OUNTER)
	TCIPBP==R7		; P(ARALLEL)B(YTE)P(OINTER)
	TCIPCC==R10		; P(ARALLEL)C(HARACTER)C(OUNTER)
	TCISBP==R11		; S(ERIAL)B(YTE)P(OINTER)
	TCISCC==R12		; S(ERIAL)C(HARACTER)C(OUNTER)
	TCIMAC==R13		; MA(TCHES--)C(OMMANDS)
	TCIMAN==R14		; MA(TCHES--)N(ULLCHARACTER)

IFN 0,<
.XCREF R1,R2,R3,R4,R5,R6,R7,R10,R11,R12,R13,R14,R15,R16,R17
.XCREF X1,X2,X3,X4,IO,BP,FLAG,UTIL,STAK
>;IFN 0

	DCHOST==37
	DCSOKT==203

	DEFALO==12

	SIZBLK==200

	LBSIZE==100
	SBSIZE==20

	LHOST==13
;..SAVC ..SAVL ..SAVC ..REG ..REG ..SFLG ..REG ..SAVL ..REG ..CMCH ..CMWD ..CNUM ..IDX ..CMWD ..IDX ..IDX

SUBTTL Macros

	SALL

DEFINE	BEGINR(SAVLST,%RETN)
<	..SAVL==0
	..SAVC==0
	IFIDN <SAVLST><ALL>,<..SAVL==77777>
	IFDIF <SAVLST><ALL>,<
		IRP SAVLST,<
			IFG <SAVLST>-20,<!!
				PRINTX SAVLST NOT A REGISTER>
			IFLE <SAVLST>-20,<
				IFN ..SAVL&1←SAVLST,<!!
					PRINTX SAVLST SAVED TWICE>
				..SAVL==..SAVL!1←SAVLST
				..SAVC==..SAVC+1>>>
	IFN ..SAVL,<
		..REG==17
		REPEAT 20,<
			IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
			..REG==..REG-1>>
	DEFINE	.%RETN <%RETN>	; UNIQUE LOCATION FOR RETURN AND ENDR
	DEFINE	.%RETL <%RETN':!>
	..SFLG==0		; LARGEST SKIP RETURN
>

; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
;   JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
;   ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE	RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>

; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE	RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>

; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE	ENDR(SK,N)
<	IFB <SK>,<..N==0>
	IFIDN <SK><SKIP>,<..N==N
		IFG <..N-..SFLG>,<..SFLG==..N>>
	IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
		REPEAT ..SFLG,<
			AOS -..SAVC(STAK)>>
	.%RETL
	..REG==0
	REPEAT 20,<
		IFN ..SAVL&1←..REG,<POP STAK,..REG
			..SAVL==..SAVL-1←..REG>
		..REG==..REG+1>
	POPJ STAK,>

DEFINE	CALLR(ROUTIN)
<	PUSHJ STAK,ROUTIN>


DEFINE	TAIN(MSG)
<	HRRZI X1,MSG
	CALLR $TAIN$>

DEFINE	TCIN(CLIST,RSTR)
<	MOVE TCIO,[RSTR,,CLIST]
	CALLR $TCIN$>

DEFINE	TSIN(BUFFER,BUFS,MSG,NOECHO)
<	MOVE IO,[BUFFER,,<5*BUFS>-1]
	IFB <NOECHO>,< HRRZI UTIL,MSG>
	IFNB <NOECHO>,< HRROI UTIL,MSG>
	CALLR $TSIN$>

DEFINE	TNIN(MSG,RADIX)
<	IFB <RADIX>,< MOVE IO,[MSG,,↑D10]>
	IFNB <RADIX>,< MOVE IO,[MSG,,RADIX]>
	CALLR $TNIN$>

DEFINE	TNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE X1,REG>
	IFB <RADIX>,< HRRZI X2,↑D10>
	IFNB <RADIX>,< HRRZI X2,RADIX>
	CALLR $NOUT$>

DEFINE	DCNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE X1,REG>
	IFB <RADIX>,< HRROI X2,↑D10>
	IFNB <RADIX>,< HRROI X2,RADIX>
	CALLR $NOUT$>

DEFINE	PATH(STRING,FLAGS)
<	IFB <FLAGS>,< HRRZI FLAG,STRING>
	IFNB <FLAGS>,<
		HRRI FLAG,STRING
		HRLI FLAG,FLAGS>
	CALLR $PATH$>

DEFINE	SCOPY(SOURCE,DESTIN)
<	CAIA
	 IDPB 0,DESTIN
	ILDB 0,SOURCE
	JUMPN 0,.-2
	MOVE SOURCE,DESTIN
	IDPB 0,SOURCE
>;SCOPY

;(e)X(pand) T(erminal) C(ommand) I(nput) L(ist)

DEFINE	XTCIL <
	..CMCH==0
	..CMWD==0
	..CNUM==0
	DEFINE TCIE (NAME, ROUTINE)
	<	..CNUM==..CNUM+1
		..IDX==0
		IRPC NAME<..IDX==..IDX+1>
		IFG <..IDX-..CMCH>,<..CMCH==..IDX>
	>;TCIE
	TCIL
	..CMWD==<<<..CMCH-1>/5>+1>

	.+4+..CNUM
	..CNUM
	..CMCH
	..CMWD

	DEFINE TCIE (NAME,ROUTINE)
	<	ROUTINE
	>;TCIE
	TCIL

	DEFINE TCIE (NAME,ROUTINE)
	<	ASCII	/NAME/
		..IDX==0
		IRPC NAME<..IDX==..IDX+1>
		..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
		IFG ..IDX,<REPEAT ..IDX, <0>>
	>;TCIE
	TCIL
>;XTCIL
;STLOC LSLOC WFLOC BSLOC FSLOC HLOC ERRBTS DCCHAN DDCHAN LFCHAN LDCHAN

SUBTTL SAIL definitions

OPDEF THUD [JSP FLAG,OOPS]

OPDEF DSKPPN [047000,,400071]
OPDEF BEEP [047000,,400111]
OPDEF PTJOBX [711700,,0]
OPDEF GETLIN [051300,,0]
OPDEF SETLIN [051340,,0]
OPDEF SETACT [051640,,0]
OPDEF UOUTBF [705000,,0]

; POSITIONS IN MTAPE BLOCK

STLOC==1	; STATUS BITS RETURNED HERE
LSLOC==2	; LOCAL SOCKET
WFLOC==3	; WAIT FLAG
BSLOC==4	; BYTE SIZE LOCATION
FSLOC==5	; FOREIGN SOCKET
HLOC==6		; HOST NUMBER

ERRBTS==763600	; I/O ERROR BITS

	DCCHAN==1
	DDCHAN==2
	LFCHAN==3
	LDCHAN==4

DEFINE	TBIN(REG)
<	INCHWL REG
	TRZ REG,400
	TRZE REG,200
	 ANDI REG,37
	CAIL REG,"a"
	 CAILE REG,"z"
	  CAIA
	   SUBI	REG,"a"-"A"
>;TBIN

DEFINE	TBIN1(REG)
<	INCHRW REG
	TRZ REG,400
	TRZE REG,200
	 ANDI REG,37
	CAIL REG,"a"
	 CAILE REG,"z"
	  CAIA
	   SUBI	REG,"a"-"A"
>;TBIN

DEFINE TBOUT(REG)
<	CAIN REG,7
	 JRST [	MOVNI REG,1
		BEEP REG,
		JRST .+2]
	OUTCHR REG
>;TBOUT

DEFINE TSOUT(STRING)
<IRP STRING,<
	OUTSTR	STRING
>;IRP STRING
>;TSOUT

DEFINE	DCBIN(REG)
<	SOSGE DCIBUF+2
	 JRST [	CALLR NUTMI
		JRST .-1]
	ILDB REG,DCIBUF+1
	JUMPE REG,.-3
>;DCIBIN

DEFINE	DCBOUT(REG)
<	IDPB REG,DCOBUF+1
	OUT DCCHAN,
	 CAIA
	  JRST NETEOT>
DEFINE	DCSOUT(STRING)
<	IRP STRING
<	HRRZI X1,STRING
	CALLR NUTMO>
	OUT DCCHAN,
	 CAIA
	  JRST NETEOT>
;DFTP RENTER CMDNEW CMDCMD CMDM1 CMDM2 CMDM3

SUBTTL Main Program

DFTP:	CAI
	RESET
	OUTSTR [ASCIZ/Welcome to the wonderful world of DFTP.
/]
	MOVE STAK,[IOWD STSIZ,STBEG]	; load PDP
	MOVSI 'DSK'
	MOVEM LFCHAS+1
	SETZ
	DSKPPN
	MOVEM LFIPPN
	CALLR ICP
	CALLR D$INIT			; do DC init
	MOVE JOBFF##
	MOVEM XJOBFF
	MOVEI UTIL,CMDM2
	GETPPN
	 CAI
	HRRZS
	CAIN 'MRC'			; my autoenable hack
	 MOVEI UTIL,CMDM3
	MOVEM UTIL,CMDMOD
	JRST CMDCMD
RENTER:	MOVE STAK,[IOWD STSIZ,STBEG]
CMDNEW:	TSOUT <CRLF>
CMDCMD:	RELEASE LFCHAN,
	RELEASE DDCHAN,
	MOVE XJOBFF
	MOVEM JOBFF##
	CORE
	 JRST 4,.-1
	PTJOBX [0
		SIXBIT/DOFF/]
	SETO
	GETLIN
	CAMN [-1]			; detached?
	 EXIT
	TLO 100				; special activation
	SETLIN
	TLNE 460000			; display?
	 SKIPA R1,[[	777777,,777770	; "controls", space
			000000,,020400	; :, ?
			000000,,000000
			000001,,000000]]; ALT
	  MOVEI R1,[	-1
			-1
			-1
			-1,,600000]
	SETACT R1
	SETZM ZONKER
	MOVE [ZONKER,,ZONKER+1]
	BLT ZONKEND
	OPEN DDCHAN,DDCHAS
	 JRST [	OUTSTR [ASCIZ/?? Data channel OPEN failure ??/]
		JRST SUICID]
	OPEN LFCHAN,LFCHAS
	 JRST [	OUTSTR [ASCIZ/?? Disk channel OPEN failure ??/]
		JRST SUICID]
	INBUF LFCHAN,↑D19
	OUTBUF LFCHAN,↑D19
	JRST @CMDMOD
CMDM1:	TSOUT <[ASCIZ/*/]>
	TCIN (CMDMC1,[ASCIZ/*/])
	 JRST CMDCMD
	 JRST CMDNEW
	JRST (FLAG)
CMDM2:	TSOUT <[ASCIZ/*/]>
	TCIN (CMDMC2,[ASCIZ/*/])
	 JRST CMDCMD
	 JRST CMDNEW
	JRST (FLAG)
CMDM3:	TSOUT <[ASCIZ/!/]>
	TCIN (CMDMC3,[ASCIZ/!/])
	 JRST CMDCMD
	 JRST CMDNEW
	JRST (FLAG)
;CMDMC1 CMDMC2 CMDMC3

SUBTTL Terminal Input Dispatch Tables

DEFINE TCIL <
IFG ..MODE-2,<	TCIE ALLOCATE,CALO >
		TCIE ATTACH,CATT
		TCIE BIG,CBIG
IFG ..MODE-2,<	TCIE CHANGE,CCHA >
		TCIE CONNECT,CCON
IFG ..MODE-2,<	TCIE CREATE,CCRE >
		TCIE DELETE,CDEL
		TCIE DIRECTORY,CDIR
IFG ..MODE-2,<	TCIE DISABLE,CDIS >
IFE ..MODE-2,<	TCIE ENABLE,CENA >
		TCIE EXAMINE,CEXA
		TCIE EXPUNGE,CEXP
		TCIE GET,CGET
IFG ..MODE-2,<	TCIE LINK,CLIN >
		TCIE LIST,CLIS
		TCIE LOCAL-DIRECTORY,CLOD
		TCIE LOCAL-USER,CLOU
		TCIE NO-DATALANGUAGE,CNOD
		TCIE PUT,CPUT
		TCIE QUIT,CQUI
		TCIE REMOVE,CREM
		TCIE RENUMBER,CREN
		TCIE RETRIEVE,CRET
		TCIE SHOW-DATALANGUAGE,CSOD
		TCIE STORE,CSTO
		TCIE TIME-TRANSFERS,CTTR
		TCIE UNDELETE,CUND
		TCIE UNTIME-TRANSFERS,CUTR
>;TCIL

CMDMC1:	..MODE==1
	XTCIL
CMDMC2:	..MODE==2
	XTCIL
CMDMC3:	..MODE==3
	XTCIL
;CALO CALO1 CALO2 CATT CBIG CCHA CCON CCRE CDEL CDIR CDIR1 CDIR2 CDIR3 CDIRC CDIS CENA CEXA CEXA0 CEXP CGET CLIN CLIS CLIS1 CLIS2 CLIS3 CLISC1 CLISC2 CLOD CLOD1 CLOU Project CLOU1A CLOU1 CLOU2A CLOU2 CLOU4 CNOD CPUT CQUI CREM CREN CREN1 CREN2 CREN3 CRET CSOD CSTO CTER CTTR CUND CUTR CVER

SUBTTL Top level commands

CALO:	PATH ([ASCIZ/ ALLOCATE /],PATHNR!PATHCA)
	 JRST CMDCMD
	TSOUT <[ASCIZ/ Megabits: /]>
CALO1:	TNIN ([ASCIZ/ Megabits: /])
	 JRST CMDCMD
	JUMPN IO,CALO2
	MOVEI IO,"G"-100
	TBOUT <IO>
	JRST CALO1
CALO2:	MOVEM IO,ABUF
	TSOUT <CRLF>
	CALLR DALO
	JRST CMDCMD

CATT:	PATH ([ASCIZ/ ATTACH /],PATHNR!PATHCT)
	 JRST CMDCMD
	CALLR DATT
	JRST CMDCMD

CBIG:	PATH ([ASCIZ/ BIG /],PATHNR!PATHCA)
	 JRST CMDCMD
	CALLR DBIG
	JRST CMDCMD

CCHA:	PATH ([ASCIZ/ CHANGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST CMDCMD
	CALLR DCHA
	JRST CMDCMD

CCON:	PATH ([ASCIZ/ CONNECT /],PATHNR!PATHCA!PATHAD)
	 JRST CMDCMD
	CALLR DCON
	JRST CMDCMD

CCRE:	PATH ([ASCIZ/ CREATE /],PATHNR!PATHCA)
	 JRST CMDCMD
	CALLR DCRE
	JRST CMDCMD

CDEL:	PATH ([ASCIZ/ DELETE /],PATHNP!PATHFR!PATHAS!PATHAC!PATHAV)
	 JRST CMDCMD
	CALLR DDEL
	JRST CMDCMD

CDIR:	PATH ([ASCIZ/ DIRECTORY /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST CMDCMD
	MOVE IO,CMDMOD
	CAIN IO,CMDM3
	 JRST CDIR1
	TSOUT <[ASCIZ/**/]>
	TCIN (CDIRC,[ASCIZ/**/])
	 JRST CMDCMD
	 JRST CDIR2
	JRST CDIR3
CDIR1:	TSOUT <[ASCIZ/!!/]>
	TCIN (CDIRC,[ASCIZ/!!/])
	 JRST CMDCMD
	 JRST CDIR2
	JRST CDIR3
CDIR2:	MOVEI FLAG,DD$T
	TSOUT <[ASCIZ/TERSE/]>
CDIR3:	TSOUT <CRLF>
	CALLR DDIR
	JRST CMDCMD

CDIRC:
DEFINE TCIL <
	TCIE DELETED,DD$D
	TCIE TERSE,DD$T
	TCIE VERBOSE,DD$V
>;TCIL
	XTCIL

CDIS:	TSOUT <CRLF>
	MOVEI UTIL,CMDM2
	MOVEM UTIL,CMDMOD
	JRST CMDCMD

CENA:	TSOUT <CRLF>
	MOVEI UTIL,CMDM3
	MOVEM UTIL,CMDMOD
	JRST CMDCMD

CEXA:	PATH ([ASCIZ/ EXAMINE /],PATHNP!PATHFR!PATHAV!PATHAS)
	 JRST CMDCMD
	TSOUT <[ASCIZ/ Lines per page: /]>
	TNIN ([ASCIZ/ Lines per page: /])
	 JRST CMDCMD
	JUMPN IO,CEXA0
	SKIPN IO,DEXA$P
	 MOVEI IO,↑D20
	TNOUT <IO>
CEXA0:	MOVEM IO,DEXA$P
	TSOUT <CRLF>
	MOVE UTIL,VBUF
	LDB IO,[350700,,FBUF]
	CAIN IO,"*"
	 SETO UTIL,
	LDB IO,[350700,,EBUF]
	CAIN IO,"*"
	 SETO UTIL,
	MOVEM UTIL,DEXA$S
	CALLR DEXA
	 JRST CMDCMD
	JRST CMDCMD

CEXP:	PATH ([ASCIZ/ EXPUNGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST CMDCMD
	CALLR DEXP
	JRST CMDCMD

CGET:	PATH ([ASCIZ/ GET /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST CMDCMD
	CALLR DGET
	 JRST CMDCMD
	JRST CMDCMD

CLIN:	TSOUT <CRLF>
	CALLR DLIN
	JRST CMDCMD

CLIS:	PATH ([ASCIZ/ LIST /],PATHNR!PATHCC!PATHAS)
	 JRST CMDCMD
	MOVE IO,CMDMOD
	CAIN IO,CMDM3
	 JRST CLIS1
	TSOUT <[ASCIZ/**/]>
	TCIN (CLISC1,[ASCIZ/**/])
	 JRST CMDCMD
	 JRST CLIS2
	JRST CLIS3
CLIS1:	TSOUT <[ASCIZ/!!/]>
	TCIN (CLISC2,[ASCIZ/!!/])
	 JRST CMDCMD
	 JRST CLIS2
	JRST CLIS3
CLIS2:	MOVEI FLAG,DL$T
	TSOUT <[ASCIZ/TERSE/]>
CLIS3:	TSOUT <CRLF>
	CALLR DLIS
	JRST CMDCMD

CLISC1:
DEFINE TCIL <
	TCIE TERSE,DL$T
	TCIE VERBOSE,DL$V
>;TCIL
	XTCIL
CLISC2:
DEFINE TCIL <
	TCIE PROTECTION,DL$P
	TCIE TERSE,DL$T
	TCIE VERBOSE,DL$V
>;TCIL
	XTCIL

CLOD:	TSOUT <CRLF>
	SETZM LUTDSP
CLOD1:	CALLR LUTDS
	 JRST CMDCMD
	TSOUT <[ASCIZ/ /],LUTDSF,CRLF>
	JRST CLOD1

CLOU:	OUTSTR [ASCIZ/
 Project: /]
	MOVE IO,[ABUF,,3]	; do not use TSIN macro!!  - MRC
	HRRZI UTIL,[ASCIZ/ Project:/]
	CALLR $TSIN$
	 JRST CMDCMD
	SETZ IO,
	MOVE X1,[440700,,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU1A
	LSH IO,6
	ADDI IO,-" "(X2)
>;REPEAT 3
CLOU1A:	HRLZI UTIL,(IO)
	JUMPN IO,CLOU1
	SETZ IO,
	DSKPPN IO,
	 CAI
	HLLZ UTIL,IO
	OUTSTR [ASCIZ/(self)/]
CLOU1:	OUTSTR	[ASCIZ/
 Programmer: /]
	PUSH STAK,UTIL
	MOVE IO,[ABUF,,3]	; do not use TSIN macro!!  - MRC
	HRRZI UTIL,[ASCIZ/ Programmer:/]
	CALLR $TSIN$
	 JRST [	POP STAK,UTIL
		JRST CMDCMD]
	SETZ IO,
	POP STAK,UTIL
	MOVE X1,[440700,,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU2A
	LSH IO,6
	ADDI IO,-" "(X2)
>;REPEAT 3
CLOU2A:	HRRI	UTIL,(IO)
	JUMPN	IO,CLOU2
	SETZ IO,
	DSKPPN IO,
	 CAI
	HRR UTIL,IO
	OUTSTR [ASCIZ/(self)/]
CLOU2:	TSOUT <CRLF>
	RELEAS LDCHAN,
	MOVEM UTIL,LDIR
	MOVE IO,[SIXBIT/UFD/]
	MOVEM IO,LDIR+1
	SETZM LDIR+2
	MOVE IO,[SIXBIT/  1  1/]
	MOVEM IO,LDIR+3
	MOVE IO,LFCHAS+1
	MOVEM IO,LDCHAS+1
	OPEN LDCHAN,LDCHAS
	 JRST CLOU4
	LOOKUP LDCHAN,LDIR
	 JRST CLOU4
	RELEAS LDCHAN,
	MOVEM UTIL,LFIPPN
	JRST CMDCMD
CLOU4:	OUTSTR [ASCIZ/ (No such directory)
/]
	JRST CMDCMD

CNOD:	SETZM FLAGDD
	JRST CMDNEW

CPUT:	PATH ([ASCIZ/ PUT /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST CMDCMD
	CALLR DPUT
	 JRST CMDCMD
	JRST CMDCMD

CQUI:	TAIN <[ASCIZ/ [Confirm]/]>
	 JRST CMDCMD
	 JRST CMDCMD
	JRST QUIT

CREM:	PATH ([ASCIZ/ REMOVE /],PATHNR!PATHCC!PATHAS!PATHAC)
	 JRST CMDCMD
	CALLR DREM
	JRST CMDCMD

CREN:	PATH ([ASCIZ/ RENUMBER /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST CMDCMD
	SKIPLE X1,VBUF
	 JRST CREN2
	JUMPL X1,CREN1
	LDB UTIL,[350700,,FBUF]
	CAIN UTIL,"*"
	 JRST CREN1
	LDB UTIL,[350700,,EBUF]
	CAIE UTIL,"*"
	 JRST CREN2
CREN1:	TSOUT <[ASCIZ/ (A version number is required if *'s are used.)/],CRLF>
	JRST CMDCMD
CREN2:	TSOUT <[ASCIZ/ New version number: /]>
	TNIN ([ASCIZ/ New version number: /])
	 JRST CMDCMD
	JUMPN IO,CREN3
	MOVEI IO,"1"
	TBOUT <IO>
	MOVEI IO,1
CREN3:	MOVEM IO,ABUF
	TSOUT <CRLF>
	CALLR DREN
	JRST CMDCMD

CRET:	PATH ([ASCIZ/ RETRIEVE /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST CMDCMD
	CALLR DGET
	 JRST CMDCMD
	JRST CMDCMD

CSOD:	SETOM FLAGDD
	JRST CMDNEW

CSTO:	PATH ([ASCIZ/ STORE /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST CMDCMD
	CALLR DPUT
	 JRST CMDCMD
	JRST CMDCMD

CTER:	SETOM FLAGNN
	SETZM FLAGDD
	SETZM FLAGTT
	JRST CMDNEW

CTTR:	SETOM FLAGTT
	JRST CMDNEW

CUND:	PATH ([ASCIZ/ UNDELETE /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST CMDCMD
	CALLR DUND
	JRST CMDCMD

CUTR:	SETZM FLAGTT
	JRST CMDNEW

CVER:	SETZM FLAGNN
	JRST CMDNEW
;PATHNR PATHNP PATHNF PATHFR PATHFF PATHCT PATHCA PATHCC PATHLR PATHRL PATHAS PATHAD PATHAV PATHAC $PATH$ PAT$10 PAT$11 PAT$12 PAT$20 PAT$21 PAT$22 PAT$23 PAT$24 PAT$25

SUBTTL Path input and translation

; FLAG DEFINITIONS
	PATHNR==400000		; NODE REQUIRED
	PATHNP==200000		; NODE POSSIBLE
	PATHNF==100000		; NODE FOUND
	PATHFR==040000		; FILE REQUIRED
	PATHFF==020000		; FILE FOUND
	PATHCT==004000		; CONTEXT TOP
	PATHCA==002000		; CONTEXT ATTACH
	PATHCC==001000		; CONTEXT CONNECT
	PATHLR==000400		; LOCAL TO REMOTE
	PATHRL==000200		; REMOTE TO LOCAL
	PATHAS==000040		; ALLOW SETS
	PATHAD==000020		; ALLOW (NON-SET) DEFAULT
	PATHAV==000010		; ALLOW VERSIONS
	PATHAC==000004		; ACKNOWLEDGE [CONFIRM]

; PATH INPUT CONTROL
;   IN: TCIO -- LAST CHARACTER INPUT (TCIN)
;	FLAG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$:	BEGINR <IO,UTIL>
	MOVEI IO," "
	TBOUT <IO>
	MOVE IO,[GBUF1,,5*LBSIZE]
	SETZ UTIL,
	CALLR P$IN
	 RETURN
	PUSH STAK,IO
	MOVE IO,[GBUF1,,NBUF]
	MOVE UTIL,[FBUF,,EBUF]
	CALLR P$PP
	POP STAK,IO
	MOVEM UTIL,VBUF
	TLNN FLAG,PATHAC
	 JRST PAT$10
	TAIN <[ASCIZ/ [Confirm]/]>
	 RETURN
	 RETURN
	RETURN SKIP,1
PAT$10:	TLNE FLAG,PATHRL!PATHLR
	 JRST PAT$11
	TSOUT <CRLF>
	RETURN SKIP,1
PAT$11:	PUSH STAK,IO
	MOVE IO,[FBUF,,EBUF]
	CALLR P$LF
	POP STAK,IO
	CAIE IO,175
	 CAIN IO," "
	  JRST PAT$20
PAT$12:	TSOUT <CRLF>
	RETURN SKIP,1
PAT$20:	TLNE FLAG,PATHLR
	 JRST PAT$21
	TLNE FLAG,PATHRL
	 JRST PAT$22
	JRST PAT$23
PAT$21:	TLNE FLAG,PATHNF
	 JRST PAT$12
	JRST PAT$23
PAT$22:	TLZ FLAG,PATHNR!PATHNP!PATHAV
PAT$23:	TSOUT <[ASCIZ/ [As] /]>
	MOVE IO,[GBUF2,,5*LBSIZE]
	MOVE UTIL,[GBUF1,,[ASCIZ/ [As] /]]
	CALLR P$IN
	 RETURN
	TLNE FLAG,PATHLR
	 JRST PAT$24
	TLNE FLAG,PATHRL
	 JRST PAT$25
	RETURN
PAT$24:	MOVE IO,[GBUF2,,NBUF]
	MOVE UTIL,[FBUF,,EBUF]
	CALLR P$PP
	MOVEM UTIL,VBUF
	TSOUT <CRLF>
	RETURN SKIP,1
PAT$25:	MOVE IO,[GBUF2,,GBUF1]
	MOVE UTIL,[FSBUF,,ESBUF]
	CALLR P$PP
	MOVE IO,[FSBUF,,ESBUF]
	CALLR P$LF
	TSOUT <CRLF>
	ENDR SKIP,1
;P$I$AE P$I$DE P$I$SE P$I$TE P$I$PW P$I$CC P$I$CA P$I$CT P$I$EP P$I$VP P$IN P$ICHR P$ICHE P$ICHP P$ISA P$ISA1 P$ISA2 P$ISA3 P$ISD1 P$ISD2 P$ISD9 P$ISVS P$ISVN P$ISS P$IST P$IPON P$IPOF P$IBAD P$IREP P$IR01 P$IR02 P$IR03 P$IR04 P$IR05 P$IR06 P$IDEL P$ID00 P$ID01 P$ID02 P$ID03 P$IENR P$IEND P$IENL P$IENV P$IENC P$IENN P$IENT P$IENS P$IENZ

; PATH INPUT
;   IN: IO -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
;       UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
;       FLAG -- (SAME AS $PATH$)
;   OUT: IO -- LAST CHARACTER INPUT
;        UTIL -- COUNT OF CHARACTERS
;   FLAGS:
	P$I$AE==400000		; ANCHOR ENCOUNTERED (<)
	P$I$DE==200000		; DESCENDER ENCOUNTERED (>,.)
	P$I$SE==100000		; SET ENCOUNTERED (*)
	P$I$TE==040000		; TRAILING NODE SET ENCOUNTERED (**)
	P$I$PW==010000		; INPUT PASSWORD
	P$I$CC==004000		; <
	P$I$CA==002000		; <<
	P$I$CT==001000		; <<<
	P$I$EP==000400		; EXTENSION BEING PROCESSED
	P$I$VP==000200		; VERSION BEING PROCESSED

P$IN:	BEGINR <BP,R10,R11,R12,R13>
	SETZ R10,
	MOVE R11,IO
	MOVE R12,UTIL
	HLR BP,IO
	HRLI BP,440700
	SETZ UTIL,
P$ICHR:	TBIN <IO>
	CAIN IO,"R"-100
	 JRST P$IREP
	CAIE IO,177
	 CAIN IO,"A"-100
	  JRST P$IDEL
	CAIE IO,"U"-100
	 CAIN IO,"X"-100
	  JRST P$IENR
	CAIN IO,15
	 JRST P$ICHR
	CAIE IO,12
	 CAIN IO,175
	  JRST P$IEND
	CAIN IO,37
	 JRST P$IEND
	CAIL IO," "
	 CAIN IO,42
	  JRST P$IBAD
	CAIE IO,47
	 TRNE R10,P$I$TE
	  JRST P$IBAD
	CAIL UTIL,(R11)
	 JRST P$IBAD
	TRNE R10,P$I$PW
	 JRST P$ICHP
	CAIN IO," "
	 JRST P$IEND
	CAIN IO,"?"
	 JRST P$IBAD
	CAIN IO,"*"
	 JRST P$ISS
	TRNE R10,P$I$VP
	 JRST P$ISVN
	CAIN IO,";"
	 JRST P$ISVS
	CAIN IO,":"
	 JRST P$IPON
	CAIN IO,"<"
	 JRST P$ISA
	CAIN IO,">"
	 JRST P$ISD1
	CAIN IO,"."
	 JRST P$ISD2
	TRNE R10,P$I$SE
	 JRST P$IBAD
	TRZ R10,P$I$AE!P$I$DE
P$ICHE:	IDPB IO,BP
	TBOUT <IO>
	AOJA UTIL,P$ICHR
P$ICHP:	CAIN IO,">"
	 JRST P$IPOF
	CAIN IO,"'"
	 JRST P$IBAD
	IDPB IO,BP
	AOJA UTIL,P$ICHR
P$ISA:	TLNN FLAG,PATHNR!PATHNP
	 JRST P$IBAD
	TRNN R10,P$I$CC
	 JRST P$ISA1
	TRNN R10,P$I$CA
	 JRST P$ISA2
	TRNN R10,P$I$CT
	 JRST P$ISA3
	JRST P$IBAD
P$ISA1:	JUMPN UTIL,P$IBAD
	TRO R10,P$I$AE!P$I$CC
	JRST P$ICHE
P$ISA2:	CAIE UTIL,1
	 JRST P$IBAD
	TRO R10,P$I$AE!P$I$CA
	JRST P$ICHE
P$ISA3:	CAIE UTIL,2
	 JRST P$IBAD
	TRO R10,P$I$AE!P$I$CT
	JRST P$ICHE
P$ISD1:	TLNE FLAG,PATHNR!PATHNP
	 TRNE R10,P$I$AE!P$I$EP
	  JRST P$IBAD
	JUMPE UTIL,P$IBAD
	TLNE FLAG,PATHFR
	 TRNN R10,P$I$SE
	  TROE R10,P$I$DE
	   JRST P$IBAD
	JRST P$ISD9
P$ISD2:	TLNE FLAG,PATHFR
	 TRNE R10,P$I$AE!P$I$DE!P$I$EP
	  JRST P$IBAD
	JUMPE UTIL,P$IBAD
	TRO R10,P$I$DE!P$I$EP
P$ISD9:	TRZ R10,P$I$SE
	JRST P$ICHE
P$ISVS:	TLNE FLAG,PATHAV
	 TLNN FLAG,PATHFR
	  JRST P$IBAD
	JUMPE UTIL,P$IBAD
	TRNE R10,P$I$DE
	 TRNE R10,P$I$EP
	  TRNE R10,P$I$AE!P$I$VP
	   JRST P$IBAD
	TRZ R10,P$I$SE!P$I$EP
	TRO R10,P$I$VP!P$I$DE
	JRST P$ICHE
P$ISVN:	CAIL IO,"0"
	 CAILE IO,"9"
	  JRST P$IBAD
	TRNE R10,P$I$SE
	 JRST P$IBAD
	TRZ R10,P$I$DE
	JRST P$ICHE
P$ISS:	TLNN FLAG,PATHAS
	 JRST P$IBAD
	TRNE R10,P$I$SE
	 JRST P$IST
	TRZN R10,P$I$AE!P$I$DE
	 JUMPN UTIL,P$IBAD
	TRO R10,P$I$SE
	JRST P$ICHE
P$IST:	TLNN FLAG,PATHFR
	 TRNN R10,P$I$EP!P$I$VP
	  JRST P$IBAD
	TRO R10,P$I$TE
	JRST P$ICHE
P$IPON:	TLNE FLAG,PATHNR!PATHNP
	 TRNE R10,P$I$AE!P$I$DE!P$I$SE
	  JRST P$IBAD
	CAIL UTIL,-1(R11)
	 JRST P$IBAD
	IDPB IO,BP
	TBOUT <IO>
	MOVEI X1,"P"-100
	IDPB X1,BP
	ADDI UTIL,2
	TRO R10,P$I$PW
	JRST P$ICHR
P$IPOF:	CAIL UTIL,-1(R11)
	 JRST P$IBAD
	MOVEI X1,"P"-100
	IDPB X1,BP
	IDPB IO,BP
	TBOUT <IO>
	ADDI UTIL,2
	TRZ R10,P$I$PW
	TRO R10,P$I$DE
	JRST P$ICHR
P$IBAD:	MOVEI IO,"G"-100
	TBOUT <IO>
	JRST P$ICHR
P$IREP:	TSOUT <CRLF>
	TSOUT <(FLAG)>
	JUMPE R12,P$IR04
	HLR R13,R12
	HRLI R13,440700
	TRZ R10,P$I$PW
P$IR01:	ILDB IO,R13
	JUMPE IO,P$IR03
	CAIN IO,"P"-100
	 JRST P$IR02
	TRNE R10,P$I$PW
	 JRST P$IR01
	TBOUT <IO>
	JRST P$IR01
P$IR02:	TRC R10,P$I$PW
	JRST P$IR01
P$IR03:	TSOUT <(R12)>
P$IR04:	HRRZI IO,(BP)
	HLR R13,R11
	CAIGE IO,(R13)
	 JRST P$ICHR
	HRLI R13,440700
	TRZ R10,P$I$PW
P$IR05:	CAMN R13,BP
	 JRST P$ICHR
	ILDB IO,R13
	CAIN IO,"P"-100
	 JRST P$IR06
	TRNE R10,P$I$PW
	 JRST P$IR05
	TBOUT <IO>
	JRST P$IR05
P$IR06:	TRC R10,P$I$PW
	JRST P$IR05
P$IDEL:	JUMPE UTIL,P$IENR
	MOVEI IO,"\"
	TBOUT <IO>
	LDB IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	CAIN IO,"P"-100
	 JRST P$ID01
	LDB X1,BP
	CAIN X1,"P"-100
	 JRST P$ID02
	TRNE R10,P$I$PW
	 SOJA UTIL,P$ICHR
	TBOUT <IO>
	TRZ R10,P$I$AE!P$I$DE!P$I$SE!P$I$TE
	CAIN IO,"."
	 TRZ R10,P$I$EP
	CAIN IO,";"
	 TRZ R10,P$I$VP
	CAIE IO,"<"
	 JRST P$ID00
	TRZE R10,P$I$CT
	 JRST P$ID00
	TRZE R10,P$I$CA
	 JRST P$ID00
	TRZ R10,P$I$CC
P$ID00:	SOJE UTIL,P$ICHR
	LDB X1,BP
	CAIN X1,"<"
	 TRO R10,P$I$AE
	CAIE X1,">"
	 CAIN X1,"."
	  TRO R10,P$I$DE
	CAIN X1,";"
	 TRO R10,P$I$DE
	CAIN X1,"*"
	 TRO R10,P$I$SE
	JRST P$ICHR
P$ID01:	TRZ R10,P$I$PW
	LDB IO,BP
	JRST P$ID03
P$ID02:	TROE R10,P$I$PW
	 SOJA UTIL,P$ICHR
	TRZ R10,P$I$DE
P$ID03:	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	TBOUT <IO>
	SUBI UTIL,2
	JRST P$ICHR
P$IENR:	TSOUT <[ASCIZ/XXX/],CRLF>
	SETO IO,
	SETZ UTIL,
	RETURN
P$IEND:	CAIE IO,12
	 CAIN IO,37
	  JRST P$IENL
	TLNN FLAG,PATHAS
	 JRST P$IENV
	JUMPE UTIL,P$IENV
	LDB R13,BP
	CAIN R13,">"
	 JRST P$IENT
	TLNE FLAG,PATHFR
	 TLNE FLAG,PATHAS
	  JRST P$IENV
	CAIA
P$IENL:	 TLNE FLAG,PATHFR
	  TRNN R10,P$I$AE
	   JRST P$IENV
	JRST P$IBAD
P$IENV:	TRNE R10,P$I$DE
	 TRNE R10,P$I$EP
	  CAIA
	   JRST P$IBAD
	JUMPN UTIL,P$IENN
	TLNN FLAG,PATHAS
	 JRST P$IENC
	MOVE R12,[440700,,[ASCIZ/**/]]
	TLNN FLAG,PATHFR
	 JRST P$IENS
	HRRI R12,[ASCIZ/*.*/]
	TLNE FLAG,PATHAV
	 HRRI R12,[ASCIZ/*.*;*/]
	JRST P$IENS
P$IENC:	TLNN FLAG,PATHAD
	 JRST P$IBAD
	MOVE R12,[440700,,[ASCIZ/<</]]
	TLNE FLAG,PATHCC
	 HRRI R12,[ASCIZ/</]
	JRST P$IENS
P$IENN:	TLNE FLAG,PATHAS
	 TRNE R10,P$I$EP!P$I$VP
	  JRST P$IENZ
	TLNE FLAG,PATHFR
	 TRNE R10,P$I$AE!P$I$DE
	  CAIN IO,12
	   JRST P$IENZ
	CAIN IO,37
	 JRST P$IENZ
	LDB R13,BP
	CAIN R13,"<"
	 JRST P$IENT
	MOVEI R13,">"
	IDPB R13,BP
	TBOUT <R13>
	ADDI UTIL,1
P$IENT:	MOVE R12,[440700,,[ASCIZ/**/]]
	TLNN FLAG,PATHFR
	 JRST P$IENS
	HRRI R12,[ASCIZ/*.*/]
	TLNE FLAG,PATHAV
	 HRRI R12,[ASCIZ/*.*;*/]
P$IENS:	ILDB R13,R12
	IDPB R13,BP
	JUMPE R13,RETN(1)
	TBOUT <R13>
	AOJA UTIL,P$IENS
P$IENZ:	SETZ R13,
	IDPB R13,BP
	ENDR SKIP,1
;P$PP P$PS2 P$PS1 P$PS3 P$PN P$PF P$PF0 P$PF1 P$PF2 P$PF3 P$PF4 P$PF5 P$PF6

; P$PP -- PROCESS PATH (NODES AND FILES)
;   IN: IO -- SOURCE,,NODE DESTINATION
;	UTIL -- FILE DESTINATION,,EXTENSION DESTINATION
;	FLAG -- PATH CONTEXT FLAGS
;   OUT: FLAG -- FOUND FLAGS
;	 UTIL -- VERSION NUMBER (-1 *) (0 NONE)
;
P$PP:	BEGINR <BP>
	TLNE FLAG,PATHNR
	 JRST P$PN
	HLR BP,IO
	HRLI BP,440700
	TLNN FLAG,PATHNP
	 JRST P$PF0
	SETZM (IO)
	MOVE X1,BP
P$PS2:	MOVE X2,BP
P$PS1:	ILDB X3,BP
	CAIE X3,"<"
	 CAIN X3,">"
	  JRST P$PS2
	CAIE X3,"."
	 CAIN X3,";"
	  JRST P$PS3
	JUMPE X3,P$PS3
	JRST P$PS1
P$PS3:	MOVE BP,X2
	CAMN BP,X1
	 JRST P$PF
	TLO FLAG,PATHNF
	MOVE X1,BP
	LDB X2,X1
	CAIN X2,"<"
	 ILDB X2,X1
	SETZ X3,
	DPB X3,X1
	PUSH STAK,X1
	PUSH STAK,X2
	CALLR P$CP
	POP STAK,X2
	POP STAK,X1
	DPB X2,X1
	JRST P$PF
P$PN:	TLO FLAG,PATHNF
	CALLR P$CP
	RETURN
P$PF:	SKIPE (IO)
	 JRST P$PF0
	MOVE X1,[440700,,CONTEX]
	MOVE X2,[440700,,NBUF]
	SCOPY (X1,X2)
P$PF0:	TLO FLAG,PATHFF
	SETZM (UTIL)
	HLRZ X1,UTIL
	HRLI X1,440700
P$PF1:	ILDB X2,BP
	IDPB X2,X1
	JUMPE X2,P$PF3
	CAIN X2,";"
	 JRST P$PF4
	CAIE X2,"."
	 JRST P$PF1
	SETZ X2,
	DPB X2,X1
	HRRZI X1,(UTIL)
	HRLI X1,440700
P$PF2:	ILDB X2,BP
	IDPB X2,X1
	CAIN X2,";"
	 JRST P$PF4
	JUMPN X2,P$PF2
P$PF3:	SETZ UTIL,
	RETURN
P$PF4:	SETZ X2,
	DPB X2,X1
	ILDB X2,BP
	CAIE X2,"*"
	 JRST P$PF5
	SETO UTIL,
	RETURN
P$PF5:	SETZ UTIL,
P$PF6:	SUBI X2,"0"
	IMULI UTIL,↑D10
	ADDI UTIL,(X2)
	ILDB X2,BP
	JUMPN X2,P$PF6
	ENDR
;P$CP P$CPCX P$CPCT P$CPCA P$CPCC P$CPCE P$CPI P$CPI0 P$CPO P$CPQ P$CPS P$CPP P$CPE P$CPZ P$CPZ0

; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
;   IN: IO -- SOURCE,,DESTINATION
; 	FLAG -- PATH CONTEXT FLAGS
;
P$CP:	BEGINR <IO,FLAG>
	MOVEI X1,<<LBSIZE*5>-1>
	HLRZ X2,IO
	HRLI X2,350700
	HRRI X3,(IO)
	HRLI X3,440700
	LDB IO,X2
	CAIN IO,"<"
	 JRST P$CPCX
	TLNE FLAG,PATHCT
	 JRST P$CPCT
	TLNE FLAG,PATHCA
	 JRST P$CPCA
	JRST P$CPCC
P$CPCX:	ILDB IO,X2
	CAIE IO,"<"
	 JRST P$CPCC
	ILDB IO,X2
	CAIE IO,"<"
	 JRST P$CPCA
	ILDB IO,X2
P$CPCT:	MOVE X4,[440700,,[ASCIZ/%TOP./]]
	SCOPY (X4,X3)
	MOVE X4,[440700,,ANCHOR]
	SCOPY (X4,X3)
	SUBI X1,11
	JRST P$CPCE
P$CPCA:	MOVE X4,[440700,,[ASCIZ/%LOGIN/]]
	SCOPY (X4,X3)
	SUBI X1,6
	JRST P$CPCE
P$CPCC:	MOVE X4,[440700,,CONTEX]
	ILDB 0,X4
	JUMPE 0,.+4
	SOJL X1,P$CPE
	IDPB 0,X3
	JRST .-4
	MOVE X4,X3
	IDPB 0,X4
P$CPCE:	JUMPE IO,P$CPZ0
	MOVEI X4,"."
	IDPB X4,X3
	MOVEI X4,42
	SETZ FLAG,
	SOJA X1,P$CPI0
P$CPI:	ILDB IO,X2
P$CPI0:	CAIN IO,"P"-100
	 JRST P$CPI
	CAIN IO,">"
	 JRST P$CPS
	JUMPE IO,P$CPZ
	JUMPN FLAG,P$CPO
	CAIN IO,":"
	 JRST P$CPP
	CAIN IO,"*"
	 JRST P$CPO
	CAIL IO,"A"
	 CAILE IO,"Z"
	  JRST P$CPQ
P$CPO:	SOJL X1,P$CPE
	IDPB IO,X3
	JRST P$CPI
P$CPQ:	SOJL X1,P$CPE
	IDPB X4,X3
	JRST P$CPO
P$CPS:	JUMPE FLAG,.+6
	MOVEI IO,"'"
	IDPB IO,X3
	MOVEI IO,")"
	IDPB IO,R3
	SETZ FLAG,
	MOVEI IO,"."
	JRST P$CPO
P$CPP:	SUBI X1,4
	JUMPL X1,P$CPE
	MOVEI IO,"("
	IDPB IO,R3
	MOVEI IO,"'"
	IDPB IO,R3
	SETO FLAG,
	JRST P$CPI
P$CPE:	TSOUT <[ASCIZ/ (Pathname too long)/],CRLF>
	MOVE STAK,[IOWD STSIZ,STBEG]
	JRST CMDCMD
P$CPZ:	JUMPE FLAG,P$CPZ0
	MOVEI X1,"'"
	IDPB X1,X3
	MOVEI X1,")"
	IDPB X1,X3
P$CPZ0:	IDPB IO,X3
	ENDR
;P$LF P$LF1 P$LF3 P$LF2

; LOCAL FILE NAME PREPARATION
;   IN: IO -- FILE LOCATION,,EXTENSION LOCATION
;
P$LF:	BEGINR <IO>
	HLL X1,IO
	HRRI X1,FSBUF
	BLT X1,<FSBUF+SBSIZE-1>
	LDB X1,[350700,,FSBUF]
	CAIN X1,"*"
	 SETOM FSBUF
	HRLZI X1,(IO)
	HRRI X1,ESBUF
	BLT X1,<ESBUF+SBSIZE-1>
	LDB X1,[350700,,ESBUF]
	CAIN X1,"*"
	 SETOM ESBUF
	CAIN X1,0
	 SETZM ESBUF
	HLR X1,IO
	HRLI X1,440700
	MOVE X2,[440700,,ABUF]
P$LF1:	ILDB X3,X1
	IDPB X3,X2
	JUMPN X3,P$LF1
	SKIPN (IO)
	 JRST P$LF2
	MOVEI X3,"."
	DPB X3,X2
	HRRZI X1,(IO)
	HRLI X1,440700
P$LF3:	ILDB X3,X1
	IDPB X3,X2
	JUMPN X3,P$LF3
P$LF2:	HRRZI IO,ABUF
	CALLR LUTFN
	ENDR
;DALO DATT DBIG DBIG1 DBIG2 DBIG3

SUBTTL Datacomputer interface routines

; DALO -- ALLOCATE SPACE
;
DALO:	BEGINR
	DCSOUT <[ASCIZ/MODIFY /],NBUF,<[ASCIZ/,M=/]>>
	MOVE IO,ABUF
	DCNOUT <IO>
	DCSOUT <SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	ENDR

; DATT -- LOGIN TO NODE
;
DATT:	BEGINR
	DCSOUT <[ASCIZ/LOGIN /],NBUF,SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	SETZM LOGIN%
	MOVE X1,[ASCII/%LOGI/]
	MOVEM X1,CONTEX
	MOVE X1,[ASCII/N/]
	MOVEM X1,<CONTEX+1>
	SKIPN OPENED
	 RETURN
	SETZM OPENED
	DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 RETURN
	ENDR

; DBIG -- CREATE A <BIG> FILE
;
DBIG:	BEGINR <IO>
	DCSOUT <[ASCIZ/LIST /],NBUF,SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 JRST DBIG1
	TSOUT <[ASCIZ/ [Old Node]/],CRLF>
	JRST DBIG2
DBIG1:	TSOUT <[ASCIZ/ [New Node]/],CRLF>
	DCSOUT <[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
DBIG2:	SKIPN OPENED
	 JRST DBIG3
	DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAI
	SETZM OPENED
DBIG3:	DCSOUT <[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<BIG">/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	MOVE X1,[440700,,NBUF]
	MOVE X2,[440700,,OPENED]
	SCOPY (X1,X2)
	SETZM OPENEM
	DCSOUT <[ASCIZ/"<FILES">="<TERSE">/],SEMI>
	MOVE IO,[ASCII/.I231/]
	CALLR RENFIP
	 RETURN
	MOVEI IO,"Z"-100
	DCBOUT <IO>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	MOVE X1,[440700,,NBUF]
	MOVE X2,[440700,,CONTEX]
	SCOPY (X1,X2)
	ENDR
;DCHA DCHAD DCHAI DCHAI1 DCHA1A DCHAI2 DCHAI3 DCHAI4 DCHAI5 DCHAC DCHAC1 DCHAC2 DCHAC3 DCHAC4 DCHAI8

; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA:	BEGINR <IO,UTIL>
	DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIV/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
DCHAD:	DCSOUT <[ASCIZ/DELETEP /],NBUF,<[ASCIZ/,N=1/]>,SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAIA
	  JRST DCHAD
	TSOUT <[ASCIZ/ [Ok]/],CRLF>
DCHAI:	TAIN <[ASCIZ/ Add a new privilege? /]>
	 RETURN
	 RETURN
	SETZM ABUF		; WRITE FLAG
	SETZM <ABUF+1>		; HOST
	SETZM <ABUF+2>		; SOCKET
	SETOM <ABUF+3>		; PASSWORD
	TAIN <[ASCIZ/  Allow control? /]>
	 JRST DCHAI
	 SETOM ABUF
	TAIN <[ASCIZ/  Restrict via network? /]>
	 JRST DCHAI
	 JRST DCHAI5
DCHAI1:	TSOUT <[ASCIZ/   Host number (octal): /]>
	TNIN ([ASCIZ/   Host number (octal): /],10)
	 JRST DCHAI
	JUMPN IO,DCHA1A
	MOVEI IO,LHOST
	TNOUT (IO,10)
DCHA1A:	TSOUT <CRLF>
DCHAI2:	MOVEM IO,<ABUF+1>
	CAIN IO,LHOST
	 JRST DCHAI3
	TSOUT <[ASCIZ/   Socket number (octal): /]>
	TNIN ([ASCIZ/   Socket number (octal): /],10)
	 JRST DCHAI
	JRST DCHAI4
DCHAI3:	SETZ IO,
DCHAI4:	MOVEM IO,<ABUF+2>
	TSOUT <CRLF>
DCHAI5:	TAIN <[ASCIZ/  Restrict via password? /]>
	 JRST DCHAI
	 JRST DCHAC
	TSOUT <[ASCIZ/   Password: /]>
	TSIN (<ABUF+3>,<SBSIZE-3>,[ASCIZ/   Password: /])
	 JRST DCHAI
	TSOUT <CRLF>
DCHAC:	DCSOUT <[ASCIZ/CREATEP /],NBUF,<[ASCIZ/,U=**,G=LR/]>>
	SKIPE ABUF
	 JRST DCHAC1
	DCSOUT <[ASCIZ/CWA/]>
DCHAC1:	SKIPN <ABUF+1>
	 JRST DCHAC3
	DCSOUT <<[ASCIZ/,H=/]>>
	MOVE IO,<ABUF+1>
	DCNOUT <IO>
	DCSOUT <<[ASCIZ/,S=/]>>
	MOVE IO,<ABUF+2>
	JUMPE IO,DCHAC2
	DCNOUT <IO>
	JRST DCHAC3
DCHAC2:	DCSOUT <[ASCIZ/ANY/]>
DCHAC3:	SETO IO,
	CAMN IO,<ABUF+3>
	 JRST DCHAC4
	DCSOUT <<[ASCIZ/,P='/]>,<ABUF+3>,[ASCIZ/'/]>
DCHAC4:	DCSOUT <SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	TSOUT <[ASCIZ/  [Ok]/],CRLF>
	JRST DCHAI
DCHAI8:	TSOUT <[ASCIZ/ (User not found)/],CRLF>
	JRST DCHAI
	ENDR
;DCON DCON1 DCON2 DCRE

; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON:	BEGINR
	DCSOUT <[ASCIZ/LIST /],NBUF,SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 JRST DCON1
	TSOUT <[ASCIZ/ [Old Node]/],CRLF>
	JRST DCON2
DCON1:	TAIN <[ASCIZ/ [New Node][Confirm]/]>
	 RETURN
	 RETURN
	DCSOUT <[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
DCON2:	MOVE X1,[440700,,NBUF]
	MOVE X2,[440700,,CONTEX]
	SCOPY (X1,X2)
	ENDR

; DCRE -- CREATE NEW NODE
;
DCRE:	BEGINR
	DCSOUT <[ASCIZ/CREATE /],NBUF,<[ASCIZ/,M=/]>>
	MOVEI IO,DEFALO
	DCNOUT <IO>
	DCSOUT <SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	CALLR DCHA
	ENDR
;DDEL

; DDEL -- DELETE FILES
;
DDEL:	BEGINR <IO>
	SETZ IO,
	CALLR D$OPEN
	 RETURN
	SETO IO,
	CALLR D$VER
	 RETURN
	SETOM FLAGDE
	DCSOUT <[ASCIZ/BEGIN
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	DECLARE DELETED INTEGER
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	DELETED=0
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	BEGIN
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		STATUS='D'
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		DELETED=DELETED+1
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	END
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	IF DELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/END;
/]>
	CALLR RENDER
	 RETURN
	ENDR
;DDIR DDIRO1 DDIRO2 DDIRO3 DDIRO4 DDIRF DDIRF1 DDIRF2 DDIRF3 DD$D DD$T DD$T1 DD$T2 DD$V DD$V1 DD$V2 DD$V3

; DDIR -- FILE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR:	BEGINR <IO,UTIL>
	SETO IO,
	CALLR D$OPEN
	 RETURN
	SKIPN VBUF
	 SETOM VBUF
	SETZ UTIL,
	CAIN FLAG,DD$D
	 JRST DDIRO1
	CAIN FLAG,DD$T
	 JRST DDIRO2
	CAIN FLAG,DD$V
	 JRST DDIRO3
	RETURN
DDIRO1:	DCSOUT <[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI IO,[ASCIZ/ STATUS EQ 'D'/]
	JRST DDIRO4
DDIRO2:	DCSOUT <[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI IO,[ASCIZ/ STATUS EQ ' '/]
	JRST DDIRO4
DDIRO3:	DCSOUT <[ASCIZ/"<VERBOSE">="<FILES">/]>
	SETZ IO,
DDIRO4:	CALLR D$WITH
	DCSOUT <SEMI>
	MOVE IO,[ASCII/.I241/]
	CALLR RENFIP
	 RETURN
	CALLR RENLIN
DDIRF:	CALLR RENPRE
	CAMN IO,[ASCII/     /]
	 JRST DDIRF1
	CAMN IO,[ASCII/.I261/]
	 JRST DDIRF3
	LDB IO,[350700,,IO]
	CAIN IO,";"
	 JRST DDIRF2
	CALLR RENLIP
	SETZM FLAGDE
	CALLR RENDER
	 RETURN
	RETURN
DDIRF1:	CALLR <(FLAG)>
	AOJA UTIL,DDIRF
DDIRF2:	CALLR RENLIN
	JRST DDIRF
DDIRF3:	CALLR RENLIN
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	JUMPN UTIL,RETN(0)
	TSOUT <[ASCIZ/ [No Files]/],CRLF>
	ENDR

; DD$D -- DELETED FILES
;
DD$D:	BEGINR
	CALLR DD$T
	ENDR

; DD$T -- TERSE FILES
;
DD$T:	BEGINR <IO>
	SKIPE FLAGDD
	 JRST DD$T1
	MOVEI IO,11
	TBOUT <IO>
DD$T1:	DCBIN <IO>
	SKIPE FLAGDD
	 JRST DD$T2
	TBOUT <IO>
DD$T2:	CAIE IO,12
	 JRST DD$T1
	ENDR

; DD$V -- VERBOSE FILES
;
DD$V:	BEGINR <IO>
	SKIPE FLAGDD
	 JRST DD$V1
	MOVEI IO,11
	TBOUT <IO>
DD$V1:	DCBIN <IO>
	SKIPE FLAGDD
	 JRST DD$V3
	CAIN IO,11
	 JRST DD$V2
	TBOUT <IO>
	JRST DD$V3
DD$V2:	TSOUT <CRLF>
	TBOUT <IO>
	TBOUT <IO>
	JRST DD$V1
DD$V3:	CAIE IO,12
	 JRST DD$V1
	ENDR
;DEXA DEXA1 DEXA2 DEXA3 DEXA4 DEXAE DEXA$ DEXA$1 DEXA$2 DEXA$0 DEXA$3 DEXA$4 DEXA$5 DEXA$6 DEXA$7 DEXA$8 DEXA$9

; DEXA -- EXAMINE (LIST FILES TO TERMINAL)
;
DEXA:	BEGINR <IO,FLAG>
	SETZ FLAG,
	SETO IO,
	CALLR D$OPEN
	 RETURN
	SKIPLE VBUF
	 JRST DEXA1
	MOVEI IO," "
	CALLR D$VER
	 RETURN
	JRST DEXA2
DEXA1:	CALLR D$VEX
	 RETURN
DEXA2:	DCSOUT <[ASCIZ/"<GET">="<FILES">/]>
	HRRZI IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR D$WITH
	DCSOUT <SEMI>
	CALLR NETOI
	 THUD
	MOVE IO,[ASCII/;I249/]
	CALLR RENFIP
	 RETURN
	CALLR RENLIN
	SETZM NSUM
	SETZM FLAGSM
DEXA3:	SETZM DEXA$L
	CALLR EXAFIL
	 JRST DEXA4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	MOVNI IO,10
	CAMN IO,DEXA$L
	 AOJA FLAG,DEXA4
	SKIPE FLAGTT
	 CALLR NETRAT
	AOJA FLAG,DEXA3
DEXA4:	CALLR NETC
	MOVE IO,[ASCII/;I269/]
	CALLR RENFIP
	 JRST DEXAE
	CALLR RENLIN
	CALLR NETSUM
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	JUMPN FLAG,RETN(1)
	TSOUT <[ASCIZ/ (No Such File)/],CRLF>
	RETURN SKIP,1
DEXAE:	CALLR D$CON
	ENDR

; EXAMINE -- TERMINAL OUTPUT
;   IN: IO -- COUNT OF CHARACTERS IN BUFFER
;	BP -- BYTE POINTER INTO BUFFER
DEXA$:	BEGINR <UTIL,FLAG>
	SKIPGE DEXA$L
	 RETURN
	SETZ FLAG,
DEXA$1:	SKIPG IO
	 RETURN
	ILDB UTIL,BP
	JUMPE UTIL,DEXA$0
	CAIGE UTIL," "
	 JRST DEXA$3
DEXA$2:	TBOUT <UTIL>
DEXA$0:	SOJA IO,DEXA$1
DEXA$3:	CAIE UTIL,15
	 CAIN UTIL,11
	  JRST DEXA$2
	CAIE UTIL,12
	 CAIN UTIL,37
	  JRST DEXA$4
	CAIG IO,5
	 JUMPE UTIL,RETN(0)
	PUSH STAK,UTIL
	MOVEI UTIL,"↑"
	TBOUT <UTIL>
	POP STAK,UTIL
	ADDI UTIL,100
	TBOUT <UTIL>
	ADDI FLAG,1
	CAIE FLAG,20
	 SOJA IO,DEXA$1
	JRST DEXA$5
DEXA$4:	AOS X1,DEXA$L
	CAML X1,DEXA$P
	 CAIG IO,5
	  JRST DEXA$2
	SUBI IO,1
	SETZM DEXA$L
DEXA$5:	SETZ FLAG,
	TSOUT <CRLF,[ASCIZ/ More? /]>
DEXA$6:	TBIN1 UTIL
	CAIN UTIL,15
	 JRST DEXA$6
	CAIE UTIL,"Y"
	 CAIN UTIL,12
	  JRST DEXA$7
	CAIE UTIL,175
	 CAIN UTIL,37
	  JRST DEXA$7
	CAIN UTIL," "
	 JRST DEXA$7
	CAIE UTIL,"A"
	 CAIN UTIL,177
	  JRST DEXA$8
	JRST DEXA$9
DEXA$7:	TSOUT <[ASCIZ/Yes/],CRLF>
	JRST DEXA$1
DEXA$8:	TSOUT <[ASCIZ/Abort/],CRLF>
	MOVNI X1,10
	MOVEM X1,DEXA$L
	RETURN
DEXA$9:	TSOUT <[ASCIZ/No/],CRLF>
	SETOM DEXA$L
	ENDR
;DEXP DEXP1 DEXP2 DEXP3 DEXP4

; DEXP -- EXPUNGE
;
DEXP:	BEGINR <IO>
	SKIPN OPENED
	 JRST DEXP1
	SETZM OPENED
	DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAI
DEXP1:	DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES"> %INFORMATION/],SEMI>
	CALLR RENPRE
	CALLR RENLIN
	CAMN IO,[ASCII/.I280/]
	 JRST DEXP2
	TSOUT <[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
DEXP2:	DCBIN <IO>
	CAIN IO," "
	 JRST DEXP3
	CAIE IO,12
	 JRST DEXP2
	DCBIN <IO>
	CAIN IO," "
	 JRST DEXP3
	CALLR RENLIN
	RETURN
DEXP3:	DCBIN <IO>
	CAIE IO,"R"
	 JRST DEXP2
	DCBIN <IO>
	CAIE IO,"E"
	 JRST DEXP2
	DCBIN <IO>
	CAIE IO,"C"
	 JRST DEXP2
	DCBIN <IO>
	CAIE IO,"S"
	 JRST DEXP2
	DCBIN <IO>
	CAIE IO,"="
	 JRST DEXP2
	CALLR DCNIN
	CALLR RENLIN
	SETZM FLAGDE
	CALLR RENDER
	 CAI
	JUMPN IO,DEXP4
	DCSOUT <[ASCIZ/DELETE /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	RETURN
DEXP4:	SETZ IO,
	CALLR D$OPEN
	 RETURN
	DCSOUT <[ASCIZ/OPEN /],NBUF,<[ASCIZ/."<FILES">,SYN="<">/]>,SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/"<FILES">="<"> WITH STATUS EQ ' '/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 CAI
	DCSOUT <[ASCIZ/CLOSE "<">/],SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAI
	DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAI
	SETZM OPENED
	ENDR
;DGET DGET1 DGET2 DGET$ DGET3 DGET4 DGETE GET$F GET$E GET$D DLIN DLINI DLINE

; DGET -- GET-RETRIEVE
;
DGET:	BEGINR <IO,FLAG>
	SETZ FLAG,
	SETO IO,
	CALLR D$OPEN
	 RETURN
	SKIPLE VBUF
	 JRST DGET1
	MOVEI IO," "
	CALLR D$VER
	 RETURN
	JRST DGET2
DGET1:	CALLR D$VEX
	 RETURN
DGET2:	DCSOUT <[ASCIZ/"<GET">="<FILES">/]>
	HRRZI IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR D$WITH
	DCSOUT <SEMI>
	CALLR NETOI
	 THUD
	MOVE IO,[ASCII/;I249/]
	CALLR RENFIP
	 RETURN
	CALLR RENLIN
	SKIPE FLAGNN
	 JRST DGET$
	TSOUT <[ASCIZ/ [Ok]/],CRLF>
DGET$:	SETZM NSUM
	SETZM FLAGSM
DGET3:	CALLR GETFIL
	 JRST DGET4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	CALLR LOCNFO
	SETZM FLAGFE
	CALLR LOCOO
	 SETOM FLAGFE
	CALLR GETDAT
	CALLR LOCC
	SKIPE FLAGTT
	 CALLR NETRAT
	AOJA FLAG,DGET3
DGET4:	CALLR NETC
	MOVE IO,[ASCII/;I269/]
	CALLR RENFIP
	 JRST DGETE
	CALLR RENLIN
	CALLR NETSUM
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	JUMPN FLAG,RETN(1)
	TSOUT <[ASCIZ/ (No Such File)/],CRLF>
	RETURN SKIP,1
DGETE:	CALLR D$CON
	ENDR

; FIELD LENGTHS IN WORDS FROM <GET>
	GET$F==SBSIZE		; FILENAME
	GET$E==SBSIZE		; EXTENSION
	GET$D==4		; DATE

; DLIN -- DATACOMPUTER LINK
;
DLIN:	BEGINR <IO,UTIL,FLAG>
	MOVE FLAG,FLAGDD
DLINI:	TSOUT (<[BYTE (7)76,0,0,0,0]>)
	TSIN (ABUF,SBSIZE,<[BYTE (7)76,0,0,0,0]>)
	 JRST DLINI
	JUMPE UTIL,DLINE
	TSOUT <CRLF>
	SETZM FLAGDD
	DCSOUT <ABUF,CRLF>
	SETOM FLAGDD
	CALLR RENDER
	 JRST DLINI
	JRST DLINI
DLINE:	TSOUT <[ASCIZ/[Returning]/],CRLF>
	MOVEM FLAG,FLAGDD
	ENDR
;DLIS DLISO1 DLISO2 DLISO3 DLISI DLISN DLISD DLISE DL$T DL$T0 DL$V DL$VL DL$VN DL$VT DL$VT1 DL$VT2 DL$VE DL$P DL$P1 DL$P2 DL$P3 DL$P4 DL$NAM DL$NAN DL$NA1 DL$NA2 DL$NA3 DL$NIN DL$NI1 DL$NI2 DL$NI3 DL$NCN DL$NC1 DL$NON DL$NO1 DL$NO2 DL$NER

; DLIS -- NODE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DLIS:	BEGINR <IO,BP,UTIL>
	CALLR D$HEAD
	CAIN FLAG,DL$T
	 JRST DLISO1
	CAIN FLAG,DL$V
	 JRST DLISO2
	CAIN FLAG,DL$P
	 JRST DLISO3
	RETURN
DLISO1:	DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %NAME/],SEMI>
	JRST DLISI
DLISO2:	DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %INFORMATION/],SEMI>
	JRST DLISI
DLISO3:	DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIVILEGE/],SEMI>
DLISI:	SETZ UTIL,
	SETZM GBUF1
	MOVE X1,[GBUF1,,GBUF1+1]
	BLT X1,<GBUF1+LBSIZE-1>
	MOVEI X1,<GBUF2+1>
	MOVEM X1,GBUF2
	CALLR RENPRE
	CAMN IO,[ASCII/.I280/]
	 JRST DLISD
	CALLR RENLIP
	SETZM FLAGDE
	CALLR RENDER
	 RETURN
	RETURN
DLISN:	DCBIN <IO>
	CAIE IO," "
	 JRST DLISE
	SETO UTIL,
	SKIPE FLAGDD
	 JRST DLISD
	CALLR <(FLAG)>
	JRST DLISN
DLISD:	CALLR RENLIN
	CAIE FLAG,DL$V
	 JRST DLISN
	CALLR DL$V
DLISE:	CAIN IO,"?"
	 JRST DEATH
	CALLR RENLIN
	SETZM FLAGDE
	CALLR RENDER
	 JRST .+1
	JUMPN UTIL,RETN(0)
	TSOUT <[ASCIZ/  [No Nodes]/],CRLF>
	ENDR

; DL$T -- TERSE NODES
;
DL$T:	BEGINR
	CALLR DL$NAM
	 JRST DL$T0
	TSOUT CRLF
DL$T0:	CALLR RENLIN
	ENDR

; DL$V -- VERBOSE NODES
;
DL$V:	BEGINR
DL$VL:	DCBIN <IO>
	CAIE IO," "
	 RETURN
	SETO UTIL,
	SKIPN FLAGDD
	 JRST DL$VN
	CALLR RENLIN
	JRST DL$VL
DL$VN:	CALLR RENPRE
	CAME IO,[ASCII/NAME=/]
	 JRST DL$VT
	CALLR DL$NAM
	 JRST DL$VE
	TSOUT CRLF
	MOVEI FLAG,GBUF1
	SKIPE (FLAG)
	 AOJA FLAG,.-1
	SUBI FLAG,GBUF1
	CALLR RENLIN
	JRST DL$VL
DL$VT:	MOVEM IO,UBUF1
	SETZM <UBUF1+1>
	MOVEI IO,(FLAG)
DL$VT1:	TSOUT <[ASCIZ/    /]>
	SOJGE IO,DL$VT1
	MOVEI IO,"]"
	TBOUT <IO>
	TSOUT <UBUF1>
DL$VT2:	DCBIN <IO>
	TBOUT <IO>
	CAIE IO,12
	 JRST DL$VT2
	JRST DL$VL
DL$VE:	CALLR RENLIN
	ENDR

; DL$P -- PROTECTION
;
DL$P:	BEGINR <IO,BP>
	CALLR DL$NAM
	 JRST DL$P1
	TSOUT CRLF
	CALLR RENLIN
	RETURN
DL$P1:	MOVEI IO,GBUF1
DL$P2:	SKIPE (IO)
	 AOJA IO,DL$P2
	SUBI IO,GBUF1
DL$P3:	TSOUT <[ASCIZ/    /]>
	SOJGE IO,DL$P3
	MOVEI IO,"]"
	TBOUT <IO>
DL$P4:	DCBIN <IO>
	TBOUT <IO>
	CAIE IO,12
	 JRST DL$P4
	ENDR

; DL$NAM -- DIRECTORY: NAME OUTPUT
;   OUT: IO -- LAST CHARACTER INPUT
;
DL$NAM:	BEGINR <BP,UTIL,FLAG,R10>
	SETZ R10,
	SETZ FLAG,
	MOVE BP,[440700,,ABUF]
	MOVEI UTIL,<SBSIZE*5>
	DCBIN <IO>
	CAILE IO," "
	 JRST DL$NA1
	RETURN
DL$NAN:	DCBIN <IO>
DL$NA1:	CAIN IO,"."
	 JRST DL$NIN
	CAIG IO," "
	 JRST DL$NA3
	CAIE IO,42
	 JRST DL$NA2
	DCBIN <IO>
DL$NA2:	IDPB IO,BP
	SOJG UTIL,DL$NAN
	JRST DL$NER
DL$NA3:	SETZ X1,
	IDPB X1,BP
	TSOUT <[ASCIZ/  /],ABUF>
	RETURN SKIP,1
DL$NIN:	MOVE BP,[440700,,ABUF]
	MOVEI UTIL,<SBSIZE*5>
DL$NI1:	DCBIN <IO>
	CAIN IO,"."
	 JRST DL$NCN
	CAIG IO," "
	 JRST DL$NCN
DL$NI2:	CAIE IO,42
	 JRST DL$NI3
	DCBIN <IO>
DL$NI3:	IDPB IO,BP
	SOJG UTIL,DL$NI1
	JRST DL$NER
DL$NCN:	SETZ X1,
	IDPB X1,BP
	SKIPN X2,GBUF1(FLAG)
	 JRST DL$NON
	HRLI X2,440700
	MOVE X1,[440700,,ABUF]
DL$NC1:	ILDB X3,X1
	ILDB X4,X2
	CAIE X3,(X4)
	 JRST DL$NON
	JUMPN X3,DL$NC1
	CAIG IO," "
	 RETURN SKIP,1
	AOJA FLAG,DL$NIN
DL$NON:	CAIL FLAG,LBSIZE-2
	 JRST DL$NER
	SETZM GBUF1+1(FLAG)
	HRL X1,GBUF1+1(FLAG)
	HRR X1,GBUF1+2(FLAG)
	BLT X1,<GBUF1+LBSIZE-1>
	MOVE X1,[440700,,ABUF]
	SKIPN X2,GBUF1(FLAG)
	 HRR X2,GBUF2
	HRLI X2,440700
	HRRZI BP,(BP)
	SUBI BP,<ABUF-1>
	ADDI BP,(X2)
	CAIL BP,<GBUF2+LBSIZE>
	 JRST DL$NER
	HRRZM X2,GBUF1(FLAG)
DL$NO1:	ILDB X3,X1
	IDPB X3,X2
	JUMPN X3,DL$NO1
	HRRZI X2,1(X2)
	MOVEM X2,GBUF2
	MOVEI UTIL,(FLAG)
	JUMPE R10,DL$NO2
	TSOUT CRLF
DL$NO2:	TSOUT <[ASCIZ/    /]>
	SOJGE UTIL,DL$NO2
	TSOUT <ABUF>
	SETO R10,
	CAIG IO," "
	 RETURN	SKIP,1
	AOJA FLAG,DL$NIN
DL$NER:	TSOUT <[ASCIZ/ (Pathname too long.)/],CRLF>
	ENDR
;DPUT DPUT1 DPUT2 DPUT3 DPUT4 DPUT$1 DPUT5 DPUT6 DPUT$2 DPUT7 DPUTE

; DPUT -- PUT-STORE
;
DPUT:	BEGINR <IO>
	CALLR LOCFFI
	 RETURN
	SKIPN OPENED
	 JRST DPUT3
	MOVE X1,[440700,,OPENED]
	MOVE X2,[440700,,NBUF]
DPUT1:	ILDB X3,X1
	ILDB X4,X2
	CAIE X3,(X4)
	 JRST DPUT2
	JUMPN X3,DPUT1
	MOVEI X1,1
	CAMN X1,OPENEM
	 JRST DPUT5
	DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	MOVEI X1,1
	MOVEM X1,OPENEM
	JRST DPUT5
DPUT2:	SETZM OPENED
	DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAI
DPUT3:	DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 JRST DPUT4
	DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	MOVE X1,[440700,,NBUF]
	MOVE X2,[440700,,OPENED]
	SCOPY (X1,X2)
	MOVEI X1,1
	MOVEM X1,OPENEM
	JRST DPUT5
DPUT4:	DCSOUT <[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<FILE">/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	SKIPE FLAGNN
	 JRST DPUT$1
	TSOUT <[ASCIZ/ [New <FILES>]/],CRLF>
DPUT$1:	MOVE X1,[440700,,NBUF]
	MOVE X2,[440700,,OPENED]
	SCOPY (X1,X2)
	SETZM OPENEM
	DCSOUT <[ASCIZ/"<FILES">="<TERSE">/],SEMI>
	MOVE IO,[ASCII/.I231/]
	CALLR RENFIP
	 RETURN
	MOVEI IO,"Z"-100
	DCBOUT <IO>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	MOVEI X1,1
	MOVEM X1,OPENEM
	SETZM VBUF
	JRST DPUT6
DPUT5:	SETZB IO,VBUF
	CALLR D$VER
	 RETURN
DPUT6:	AOS VBUF
	DCSOUT <[ASCIZ/"<FILES">="<PUT">/],SEMI>
	CALLR NETOO
	 THUD
	MOVE IO,[ASCII/;I239/]
	CALLR RENFIP
	 RETURN
	CALLR RENLIN
	SKIPE FLAGNN
	 JRST DPUT$2
	TSOUT <[ASCIZ/ [Ok]/],CRLF>
DPUT$2:	SETZM NSUM
	SETZM FLAGSM
	CALLR LOCOI
	 THUD
	CALLR NETFFI
DPUT7:	CALLR PUTFIL
	CALLR PUTDAT
	SKIPE FLAGTT
	 CALLR NETRAT
	CALLR LOCNFI
	 JRST DPUT7
	CALLR NETC
	MOVE IO,[ASCII/;I259/]
	CALLR RENFIP
	 JRST DPUTE
	CALLR RENLIN
	CALLR NETSUM
	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	RETURN SKIP,1
DPUTE:	CALLR D$CON
	ENDR
;DREM DREM0

; DREM -- DELETE NODES
;
DREM:	BEGINR
	SKIPN OPENED
	 JRST DREM0
	DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAI
	SETZM OPENED
DREM0:	DCSOUT <[ASCIZ/DELETE /],NBUF,SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 CAI
	DCSOUT <[ASCIZ/LIST /],CONTEX,SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAIA
	  RETURN
	TSOUT <[ASCIZ/ [Connected To Attached Node]/],CRLF>
	MOVE X1,[ASCII/%LOGI/]
	MOVEM X1,CONTEX
	MOVE X1,[ASCII/N/]
	MOVEM X1,<CONTEX+1>
	ENDR
;DREN

; DREN -- RENUMBER FILES
;
DREN:	BEGINR <IO,UTIL>
	SETZ IO,
	CALLR D$OPEN
	 RETURN
	SETO IO,
	CALLR D$VER
	 RETURN
	MOVE UTIL,VBUF
	MOVE IO,ABUF
	MOVEM IO,VBUF
	SETOM FLAGDE
	DCSOUT <[ASCIZ/BEGIN/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/ DECLARE SAMEVERSION INTEGER/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/ SAMEVERSION=0/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/ FOR FILES IN "<FILES">/]>
	SETZ IO,
	CALLR D$WITH
	DCSOUT <CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/  SAMEVERSION=SAMEVERSION+1/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/ IF SAMEVERSION NE 0 THEN ERROR 'VERSION ALREADY EXISTS'/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/END/],SEMI>
	CALLR RENDER
	 RETURN
	MOVEM UTIL,VBUF
	DCSOUT <[ASCIZ/BEGIN/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/ DECLARE RENUMBERED INTEGER/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/ RENUMBERED=0/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/ UPDATE FILES IN "<FILES">/]>
	HRRZI IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR D$WITH
	DCSOUT <CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/ BEGIN/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/  COMMENT FILES.FILE.HEADER.FILENAME/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/   ! '.' ! FILES.FILE.HEADER.EXTENSION/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/    ! ';' ! FILES.FILE.HEADER.VERSION/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/  VERSION=/]>
	MOVE IO,ABUF
	DCNOUT <IO>
	DCSOUT <CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/  RENUMBERED=RENUMBERED+1/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/ END/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/ IF RENUMBERED EQ 0 THEN ERROR 'NO SUCH FILE'/],CRLF>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/END/],SEMI>
	CALLR RENDER
	 RETURN
	ENDR
;DUND

; DUND -- UNDELETE
;
DUND:	BEGINR <IO>
	SETZ IO,
	CALLR D$OPEN
	 RETURN
	MOVEI IO,"D"
	CALLR D$VER
	 RETURN
	SETOM FLAGDE
	DCSOUT <[ASCIZ/BEGIN
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	DECLARE UNDELETED INTEGER
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	UNDELETED=0
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI IO,[ASCIZ/ STATUS EQ 'D'/]
	CALLR D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	BEGIN
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		STATUS=' '
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		UNDELETED=UNDELETED+1
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	END
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	IF UNDELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/END;
/]>
	CALLR RENDER
	 RETURN
	ENDR
;D$INIT D$IN0 D$IN3 D$IN4 D$IN2 D$IND D$INP

; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT:	BEGINR <IO,BP,UTIL,FLAG>
	SETZM FLAGDE
	SETZM LOGIN%
	CALLR RENDER
	 CAIA
	  JRST D$IN0
	TSOUT <[ASCIZ/ ?? Datacomputer initialization failure ??/],CRLF>
	JRST QUIT
D$IN0:	TSOUT <[ASCIZ/ [Attaching]/],CRLF>
	MOVE IO,[440700,,[ASCIZ/%TOP.DFTP.SUAI./]]
	MOVE BP,[440700,,ABUF]
	SCOPY (IO,BP)
	GETPPN X1,
	 CAI
	TRNN X1,770000
	 JRST [	LSH X1,↑D6
		JRST .-1]		; Left Justify SAIL PN's
	HRLZM X1,UBUF1
	SETZM UBUF1+1
	MOVE X1,[440600,,UBUF1]
	MOVEI X2,42
D$IN3:	ILDB X3,X1
	JUMPE X3,D$IN4
	ADDI X3,40
	CAIL X3,"A"
	 CAILE X3,"Z"
	  IDPB X2,BP
	IDPB X3,BP
	JRST D$IN3
D$IN4:	MOVE X1,BP
	IDPB X3,X1
	DCSOUT <[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR RENPRE
	CALLR RENLIN
	SETZM FLAGDE
	CALLR RENDER
	 CAI
	CAMN IO,[ASCII/;O032/]
	 JRST D$INP
	CAME IO,[ASCII/+U107/]
	 JRST D$IND
	MOVEI FLAG,3
D$IN2:	TSOUT <[ASCIZ/  [Password:/]>
	TSIN (UBUF1,LBSIZE,<[ASCIZ/  [Password:/]>,NOECHO)
	 JRST D$IN2
	TSOUT <[ASCIZ/]/],CRLF>
	MOVE X2,BP
	MOVEI X1,"("
	IDPB X1,X2
	MOVEI X1,"'"
	IDPB X1,X2
	MOVE X1,[440700,,UBUF1]
	SCOPY (X1,X2)
	MOVEI X1,"'"
	IDPB X1,X2
	MOVEI X1,")"
	IDPB X1,X2
	SETZ X1,
	IDPB X1,X2
	DCSOUT <[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR RENDER
	 CAIA
	  JRST D$INP
	TSOUT <[ASCIZ/   (Incorrect password)/],CRLF>
	SOJG FLAG,D$IN2
	TSOUT <[ASCIZ/ [Attaching]/],CRLF>
D$IND:	MOVE X1,[440700,,[ASCIZ/%TOP.DFTP.DFTP.GUEST/]]
	MOVE X2,[440700,,ABUF]
	SCOPY (X1,X2)
	DCSOUT <[ASCIZ/LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 JRST QUIT
	TSOUT <[ASCIZ/  (as DFTP.GUEST)/],CRLF>
D$INP:	DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<GET"> READ/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 JRST QUIT
	DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<PUT"> WRITE/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 JRST QUIT
	DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<TERSE"> READ/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 JRST QUIT
	DCSOUT <[ASCIZ/OPEN %TOP.DFTP."<VERBOSE"> READ/],SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 JRST QUIT
	SETZM LOGIN%
	MOVE UTIL,[ASCII/%LOGI/]
	MOVEM UTIL,CONTEX
	MOVE UTIL,[ASCII/N/]
	MOVEM UTIL,<CONTEX+1>
	SETZM OPENED
	CALLR D$CON
	ENDR
;D$CON

; D$CON -- CONNECT
;
D$CON:	BEGINR <UTIL>
	CALLR NETDSI
	DCSOUT <[ASCIZ/CONNECT "<GET"> /]>
	DCNOUT <UTIL>
	DCSOUT <SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 JRST QUIT
	CALLR NETDSO
	DCSOUT <[ASCIZ/CONNECT "<PUT"> /]>
	DCNOUT <UTIL>
	DCSOUT <SEMI>
	SETOM FLAGDE
	CALLR RENDER
	 JRST QUIT
	ENDR
;D$HEAD D$HET1 D$HET2 D$HET3 D$HET4 D$HET5 D$HEL1 D$HEL2 D$HEL3 D$HEL4 D$HEL5 D$HEL6 D$HEL7 D$HEL8 D$HEF1 D$HEF2 D$HEF3 D$HEF4 D$HED1

; D$HEAD -- PRINT HEADER FOR DDIR AND DLIS
;   IN: FLAG -- DIRECTORY DISPATCH ROUTINE
;
D$HEAD:	BEGINR <IO,BP,UTIL>
	MOVE IO,NBUF
	CAMN IO,[ASCII/%TOP./]
	 JRST D$HET1
	CAMN IO,[ASCII/%LOGI/]
	 JRST D$HEL1
	RETURN
D$HET1:	SKIPE FLAGDD
	 RETURN
	TSOUT [ASCIZ/ <<</]
	MOVE BP,[440700,,NBUF+1]
D$HET2:	ILDB IO,BP
	JUMPE IO,D$HEF1
	CAIE IO,"."
	 JRST D$HET2
D$HET3:	ILDB IO,BP
	JUMPE IO,D$HEF1
	CAIN IO,42
	 JRST D$HET3
	CAIN IO,"("		; ( -- PASSWORD
	 JRST D$HET4
	CAIN IO,"."
	 MOVEI IO,">"
	TBOUT <IO>
	JRST D$HET3
D$HET4:	IBP BP		; '
D$HET5:	ILDB IO,BP
	JUMPE IO,D$HEF1
	CAIN IO,42
	 JRST D$HET5
	CAIE IO,"'"		; '
	 JRST D$HET5
	IBP BP		; )
	JRST D$HET3
D$HEL1:	SKIPE LOGIN%
	 JRST D$HEL5
	DCSOUT <[ASCIZ/LIST %LOGIN %NAME/],SEMI>
	CALLR RENPRE
	CALLR RENLIN
	CAMN IO,[ASCII/.I280/]
	 JRST D$HEL2
	SETZM FLAGDE
	CALLR RENDER
	 RETURN
	RETURN
D$HEL2:	DCBIN <IO>
	CAIN IO,15
	 JRST D$HEL4
	CAIE IO,"."
	 JRST D$HEL2
	MOVE BP,[440700,,LOGIN%]
D$HEL3:	DCBIN <IO>
	CAIN IO,15
	 JRST D$HEL4
	CAIN IO," "
	 JRST D$HEL4
	CAIN IO,42
	 JRST D$HEL3
	CAIN IO,"."
	 MOVEI IO,">"
	IDPB IO,BP
	JRST D$HEL3
D$HEL4:	SETZ IO,
	IDPB IO,BP
	CALLR RENLIN
	SETZM FLAGDE
	CALLR RENDER
	 CAI
D$HEL5:	SKIPE FLAGDD
	 RETURN
	TSOUT [ASCIZ/ <<</]
	TSOUT LOGIN%
	MOVE BP,[260700,,NBUF+1]
	LDB IO,BP
	JUMPE IO,D$HEF1
	MOVEI IO,">"
	TBOUT <IO>
D$HEL6:	ILDB IO,BP
	JUMPE IO,D$HEF1
	CAIN IO,42
	 JRST D$HEL6
	CAIN IO,"("		; ( -- PASSWORD
	 JRST D$HEL7
	CAIN IO,"."
	 MOVEI IO,">"
	TBOUT <IO>
	JRST D$HEL6
D$HEL7:	IBP BP		; '
D$HEL8:	ILDB IO,BP
	JUMPE IO,D$HEF1
	CAIN IO,42
	 JRST D$HEL8
	CAIE IO,"'"		; '
	 JRST D$HEL8
	IBP BP		; )
	JRST D$HEL6
D$HEF1:	CAIN FLAG,DD$D
	 JRST D$HEF2
	CAIN FLAG,DD$T
	 JRST D$HEF2
	CAIN FLAG,DD$V
	 JRST D$HEF2
	JRST D$HED1
D$HEF2:	MOVEI IO,">"
	TBOUT <IO>
	TSOUT <FBUF>
	MOVEI IO,"."
	TBOUT <IO>
	TSOUT <EBUF>
	SKIPN VBUF
	 JRST D$HEF4
	MOVEI IO,";"
	TBOUT <IO>
	SKIPG IO,VBUF
	 JRST D$HEF3
	TNOUT <IO>
	JRST D$HEF4
D$HEF3:	MOVEI IO,"*"
	TBOUT <IO>
D$HEF4:	CAIE FLAG,DD$D
	 JRST D$HED1
	TSOUT <[ASCIZ/[Deleted]/]>
D$HED1:	TSOUT <[ASCIZ/    /]>
	DATE IO,
	MSTIME X1,
	IDIVI X1,<↑D1000*↑D60>
	MOVE UTIL,X1
	MOVE BP,[440700,,UBUF2]
	CALLR LUTTNS
	TSOUT <UBUF2,CRLF>
	ENDR
;D$OPEN D$OP01 D$OP02 D$OP03 D$OP04 D$OP05 D$OP06 D$OP07 D$OP08 D$OP09 D$OP10

; D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
;   IN: IO -- MODE FLAG
;			READ IF < 0
;			WRITE IF = 0
;			APPEND IF > 0
;
D$OPEN:	BEGINR
	SKIPN OPENED
	 JRST D$OP05
	MOVE X1,[440700,,OPENED]
	MOVE X2,[440700,,NBUF]
D$OP01:	ILDB X3,X1
	ILDB X4,X2
	CAIE X3,(X4)
	 JRST D$OP05
	JUMPN X3,D$OP01
	CAMN IO,OPENEM
	 RETURN	SKIP,1
	JUMPE IO,D$OP02
	JUMPG IO,D$OP03
	DCSOUT <[ASCIZ/MODE "<FILES"> READ/],SEMI>
	JRST D$OP04
D$OP02:	DCSOUT <[ASCIZ/MODE "<FILES"> WRITE/],SEMI>
	JRST D$OP04
D$OP03:	DCSOUT <[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
D$OP04:	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	MOVEM IO,OPENEM
	RETURN SKIP,1
D$OP05:	DCSOUT <[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAIA
	  JRST D$OP06
	TSOUT <[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
D$OP06:	SKIPN OPENED
	 JRST D$OP07
	DCSOUT <[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM FLAGDE
	CALLR RENDER
	 CAI
	SETZM OPENED
D$OP07:	JUMPE IO,D$OP08
	JUMPG IO,D$OP09
	DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> READ/],SEMI>
	JRST D$OP10
D$OP08:	DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> WRITE/],SEMI>
	JRST D$OP10
D$OP09:	DCSOUT <[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
D$OP10:	SETOM FLAGDE
	CALLR RENDER
	 RETURN
	MOVE X1,[440700,,NBUF]
	MOVE X2,[440700,,OPENED]
	SCOPY (X1,X2)
	MOVEM IO,OPENEM
	ENDR SKIP,1
;D$VER D$VER1 D$VER2 D$VER$ D$VERE D$VERN

; D$VER -- PRODUCE PROPER VERSION NUMBER
;   IN: IO -- DEFAULT FLAG
;			SMALLEST UNDELETED VERSION IF < 0
;			LARGEST VERSION IF = 0
;			LARGEST DELETED VERSION IF = "D"
;			LARGEST UNDELETED VERSION IF = " "
;   OUT: IO -- VERSION (IF DEFAULT)
;
D$VER:	BEGINR <UTIL>
	SKIPE VBUF
	 RETURN SKIP,1
	JUMPE IO,D$VER1
	LDB UTIL,[350700,,FBUF]
	CAIN UTIL,"*"
	 SETOM VBUF
	LDB UTIL,[350700,,EBUF]
	CAIN UTIL,"*"
	 SETOM VBUF
	SKIPE VBUF
	 RETURN SKIP,1
	JUMPG IO,D$VER2
	SETOM FLAGDE
	DCSOUT <[ASCIZ/BEGIN
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	DECLARE LEAST INT
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	LEAST=-1
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	FOR "<FILES">
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	      AND (STATUS EQ ' ')/],[ASCIZ/
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	BEGIN
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		IF LEAST EQ -1 THEN LEAST=VERSION ELSE
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/			IF LEAST GT VERSION THEN LEAST=VERSION
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	END
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	IF LEAST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		COMMENT '}' ! LEAST
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/END/],SEMI>
	JRST D$VERE
D$VER1:	SETOM FLAGDE
	DCSOUT <[ASCIZ/BEGIN
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	GREATEST=0
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	FOR "<FILES">/]>
	CALLR D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	BEGIN
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	END
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	COMMENT '}' ! GREATEST
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/END/],SEMI>
	JRST D$VERE
D$VER2:	SETOM FLAGDE
	DCSOUT <[ASCIZ/BEGIN
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	GREATEST=-1
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	FOR "<FILES">
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	      AND (STATUS EQ '/]>
	DCBOUT <IO>
	SKIPN FLAGDD
	 JRST D$VER$
	TBOUT <IO>
D$VER$:	DCSOUT <[ASCIZ/')
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	BEGIN
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	END
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	IF GREATEST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		COMMENT '}' ! GREATEST
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/END/],SEMI>
D$VERE:	MOVE IO,[ASCII/;A282/]
	CALLR RENFIP
	 RETURN
D$VERN:	DCBIN <IO>
	CAIE IO,"}"
	 JRST D$VERN
	CALLR DCNIN
	MOVEM IO,VBUF
	CALLR RENLIN
	CALLR RENDER
	 RETURN
	ENDR SKIP,1
;D$VEX

; D$VEX -- VERIFY THAT VERSION EXISTS
;
D$VEX:	BEGINR <IO>
	SETOM FLAGDE
	DCSOUT <[ASCIZ/BEGIN
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	DECLARE EXTANT INT
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	EXTANT=0
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	FOR "<FILES">
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	      AND (VERSION EQ /]>
	MOVE IO,VBUF
	DCNOUT <IO>
	DCSOUT <RPAREN>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/		AND (STATUS EQ ' ')
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/			EXTANT=EXTANT+1
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/	IF EXTANT NE 1 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR RENDER
	 RETURN
	DCSOUT <[ASCIZ/END/],SEMI>
	CALLR RENDER
	 RETURN
	ENDR SKIP,1
;D$W$F D$W$E D$W$V D$W$Q D$WITH D$WIT1 D$WIT2 D$WIT3

; D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
;   IN: IO -- POINTER TO FIXED QUALIFIER (OR 0)
;   FLAGS:
	D$W$F==400000
	D$W$E==200000
	D$W$V==100000
	D$W$Q==010000
;
D$WITH:	BEGINR <UTIL,FLAG>
	SETZ FLAG,
	LDB UTIL,[350700,,FBUF]
	CAIE UTIL,"*"
	 TRO FLAG,D$W$F
	LDB UTIL,[350700,,EBUF]
	CAIE UTIL,"*"
	 TRO FLAG,D$W$E
	SKIPLE VBUF
	 TRO FLAG,D$W$V
	SKIPE IO
	 TRO FLAG,D$W$Q
	JUMPE FLAG,RETN(0)
	DCSOUT <[ASCIZ/ WITH/]>
	TRNN FLAG,D$W$F
	 JRST D$WIT1
	DCSOUT <[ASCIZ/ FILENAME EQ '/],FBUF,[ASCIZ/'/]>
	TRNN FLAG,D$W$E!D$W$V!D$W$Q
	 RETURN
	DCSOUT <[ASCIZ/ AND/]>
D$WIT1:	TRNN FLAG,D$W$E
	 JRST D$WIT2
	DCSOUT <[ASCIZ/ EXTENSION EQ '/],EBUF,[ASCIZ/'/]>
	TRNN FLAG,D$W$V!D$W$Q
	 RETURN
	DCSOUT <[ASCIZ/ AND/]>
D$WIT2:	TRNN FLAG,D$W$V
	 JRST D$WIT3
	DCSOUT <[ASCIZ/ VERSION EQ /]>
	MOVE UTIL,VBUF
	DCNOUT <UTIL>
	TRNN FLAG,D$W$Q
	 RETURN
	DCSOUT <[ASCIZ/ AND/]>
D$WIT3:	TRNN FLAG,D$W$Q
	 RETURN
	DCSOUT <(IO)>
	ENDR
;NETSUM NETS1 NETS2 NETS3 NETRAT

; NETSUM -- NETWORK CHECKSUM VERIFICATION
;
NETSUM:	BEGINR <IO,FLAG>
	CALLR RENPRE
	CAME IO,[ASCII/;I275/]
	 JRST NETS2
	SETZ FLAG,
NETS1:	DCBIN <IO>
	CAIE IO,"="
	 JRST NETS1
	SKIPN FLAG
	 SOJA FLAG,NETS1
	CALLR DCNIN
	CAME IO,NSUM
	 JRST NETS3
	CALLR RENLIN
	RETURN
NETS2:	CALLR RENLIP
	RETURN
NETS3:	CALLR RENLIN
	TSOUT <[ASCIZ/ (Network Checksum Error)/],CRLF>
	ENDR

; NETRAT -- CALCULATE AND PRINT RATE
;
NETRAT:	BEGINR <IO,<IO+1>>
	TSOUT <[ASCIZ/ (/]>
	MOVEI IO,↑D36
	IMULB IO,NSIZE
	IDIV IO,NTIME
	TNOUT <IO>
	TSOUT <[ASCIZ/ Baud (/]>
	MOVE IO,NSIZE
	TNOUT <IO>
	TSOUT <[ASCIZ/ bits in /]>
	SKIPN IO,NTIME
	 MOVEI IO,1
	TNOUT <IO>
	HRRZI <IO+1>,[ASCIZ/ seconds))/]
	CAIN IO,1
	 HRRZI <IO+1>,[ASCIZ/ second))/]
	TSOUT <(IO+1),CRLF>
	ENDR
;RENDER RENDSL RENDPM RENDFL RENDES RENDRR RENFIP RENFIL RENFIN RENFIS RENLIN RENLNL RENLIP RENLPL RENLPF RENLPP RENLPQ RENPRE RENPRP RENPRL DEATH

; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER:	BEGINR <IO,UTIL,FLAG>
	SETZ FLAG,
RENDSL:	CALLR RENPRE
	CAMN IO,[ASCII/.I220/]
	 JRST RENDES
	CAMN IO,[ASCII/.I210/]
	 JRST RENDRR
	CAME IO,[ASCII/;A282/]
	 CAMN IO,[ASCII/.J151/]
	  JRST RENDPM
	LDB UTIL,[350700,,IO]
	CAIE UTIL,"+"
	 CAIN UTIL,"-"
	  CAIA
	   JRST RENDFL
	SETO FLAG,
	SKIPN FLAGDE
	 JRST RENDFL
	SETZM FLAGDE
RENDPM:	CALLR RENLIP
	JRST RENDSL
RENDFL:	CALLR RENLIN
	JRST RENDSL
RENDES:	CALLR RENLIN
	MOVEI IO,"L"-100
	DCBOUT <IO>
	SETO FLAG,
	JRST RENDSL
RENDRR:	CALLR RENLIN
	JUMPN FLAG,RETN(0)
	ENDR SKIP,1

; RENFIP -- FIND PREFIX (ASSUMES INITIAL RENLIN)
;   IN: IO -- PREFIX
;
RENFIP:	BEGINR <BP,UTIL,FLAG>
	MOVE FLAG,IO
	SETZ UTIL,
RENFIL:	CALLR RENPRE
	CAMN IO,FLAG
	 RETURN SKIP,1
	LDB BP,[350700,,IO]
	CAIE BP,";"
	 CAIN BP,"."
	  JRST RENFIN
	SKIPN UTIL
	 CALLR RENLIP
	SKIPE UTIL
	 CALLR RENLIN
	AOJA UTIL,RENFIL
RENFIN:	CALLR RENLIN
	CAMN IO,[ASCII/.I220/]
	 JRST RENFIS
	CAMN IO,[ASCII/.I210/]
	 RETURN
	JRST RENFIL
RENFIS:	MOVEI IO,"L"-100
	DCBOUT <IO>
	SETZM FLAGDE
	CALLR RENDER
	 RETURN
	ENDR

; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN:	BEGINR <IO>
RENLNL:	DCBIN <IO>
	CAIE IO,12
	 JRST RENLNL
	ENDR

; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP:	BEGINR <IO>
	SKIPN FLAGDD
	 JRST RENLPF
RENLPL:	DCBIN <IO>
	CAIE IO,12
	 JRST RENLPL
	RETURN
RENLPF:	DCBIN <IO>
	CAIN IO,12
	 RETURN
	CAIE IO,11
	 JRST RENLPF
	MOVEI IO," "
	TBOUT <IO>
	MOVEI IO,"("
RENLPP:	TBOUT <IO>
RENLPQ:	DCBIN <IO>
	CAIN IO,42
	 JRST RENLPQ
	CAIE IO,15
	 JRST RENLPP
	DCBIN <IO>
	MOVEI IO,")"
	TBOUT <IO>
	TSOUT <CRLF>
	ENDR

; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
;   OUT: IO -- ASCII PREFIX (5 BYTES)
;
RENPRE:	BEGINR <BP,UTIL,FLAG>
RENPRP:	SETZ IO,
	MOVE BP,[440700,,IO]
	MOVEI FLAG,5
RENPRL:	DCBIN <UTIL>
	CAIE UTIL,15
	 CAIN UTIL,12
	  JRST RENPRL
	IDPB UTIL,BP
	SOJG FLAG,RENPRL
	LDB UTIL,[350700,,IO]
	CAIN UTIL,"?"
	 JRST DEATH
	CAIE UTIL,"!"
	 RETURN
	SKIPN FLAGNN
	 CALLR RENLIP
	JRST RENPRP
	ENDR

; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH:	CALLR RENLIP
	TSOUT <[ASCIZ/ ?? Fatal Datacomputer Error ??/],CRLF>
	JRST SUICID
;$TAIN$ TAIN1 TAIN5 TAIN2 TAIN3 TAIN4

; TAIN -- TERMINAL AUTHORIZATION INPUT
;   IN: X1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$:	BEGINR <IO>
TAIN1:	MOVEI IO,(X1)
	TSOUT <(IO)>
TAIN5:	TBIN1 IO
	CAIN IO,15
	 JRST TAIN5
	CAIN IO,"R"-100
	 JRST TAIN1
	CAIN IO,"N"
	 JRST TAIN2
	CAIN IO,"Y"
	 JRST TAIN3
	CAIE IO,12
	 CAIN IO,175
	  JRST TAIN4
	CAIE IO,37
	 CAIN IO," "
	  JRST TAIN4
	TSOUT <[ASCIZ/XXX/],CRLF>
	RETURN
TAIN2:	TSOUT <[ASCIZ/No/],CRLF>
	RETURN SKIP,1
TAIN3:	TSOUT <[ASCIZ/Yes/]>
TAIN4:	TSOUT <CRLF>
	ENDR SKIP,2
;$TCIN$ TCII01 TCICHR TCIC01 TCIC02 TCIC03 TCIC04 TCIC05 TCIC06 TCIC07 TCIC08 TCIC09 TCIC10 TCIBAD TCIREP TCIR01 TCIQUA TCIQ01 TCIQ02 TCIQ03 TCIDEL TCIENR TCIENN TCIEND TCIE01 TCIE02 TCIE03

; TERMINAL COMMAND INPUT ROUTINE
;
;   WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
;     INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
;   IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
;     LINE FEED, EOL, OR SPACE WILL FINISH IT.
;     IF NOT, SUCH CHARACTERS WILL BE REJECTED.
;   ↑A AND RUBOUT DELETE THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
;     ↑X AND ↑U DELETE THE LINE (RETURN TCIO=-1).
;
;	IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
;			POINTER TO COMMAND STRING LIST
;			NUMBER OF COMMANDS
;			NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
;			NUMBER OF WORDS IN LARGEST COMMAND STRING
;			<VALUE LIST>
;			<COMMAND STRING LIST>
;	OUT: TCIO -- LAST CHAR INPUT
;	     FLAG -- COMMAND VALUE
;	RETURNS: SKIP,0 -- DELETE LINE
;		 SKIP,1 -- NULL COMMAND
;		 SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$:	BEGINR <TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
	MOVE TCIACB,TCIO
	SETZ UTIL,
TCII01:	MOVEM UTIL,TCIPCL(UTIL)
	ADDI UTIL,1
	CAME UTIL,1(TCIACB)
	 JRST TCII01
	ADDI UTIL,TCIPCL
	MOVEM UTIL,TCIPNF
	HRRI UTIL,TCIPCL
	HRL UTIL,1(TCIACB)
	MOVEM UTIL,TCIPLP
	MOVE TCIBP,[440700,,ABUF]
	HRLI TCISBP,350700
	HRR TCISBP,(TCIACB)
	SETZ TCISCC,
TCICHR:	TBIN <TCIO>
	CAIN TCIO,"R"-100
	 JRST TCIREP
	CAIN TCIO,"?"
	 JRST TCIQUA
	CAIE TCIO,177
	 CAIN TCIO,"A"-100
	  JRST TCIDEL
	CAIE TCIO,"U"-100
	 CAIN TCIO,"X"-100
	  JRST TCIENR
	CAIN TCIO,15
	 JRST TCICHR
	CAIE TCIO,12
	 CAIN TCIO,37
	  JRST TCIC01
	CAIE TCIO," "
	 CAIN TCIO,175
	  JRST TCIC01
	CAIG TCIO," "
	 JRST TCIBAD
	JRST TCIC02
TCIC01:	JUMPE TCISCC,TCIENN
	HLRZ UTIL,TCIPLP(TCISCC)
	CAIN UTIL,1		; OK IF JUST ONE POSSIBILITY
	 JRST TCIEND
TCIC02:	SETZ TCIPCC,
	MOVE TCIPBP,TCISBP
	MOVE UTIL,TCIPNF
	MOVEM UTIL,<TCIPLP+1>(TCISCC)
	SETZ TCIMAC,
	HRRZI TCIMAN,-1
TCIC03:	LDB UTIL,TCIPBP
	JUMPE UTIL,TCIC04
	CAIE UTIL,(TCIO)
	 JRST TCIC08
TCIC04:	HLRZ TCITCC,TCIPLP(TCISCC)
	HRRZ TCITLP,TCIPLP(TCISCC)
TCIC05:	MOVE UTIL,(TCITLP)
	CAIN UTIL,(TCIPCC)
	 JRST TCIC06
	AOJ TCITLP,
	SOJG TCITCC,TCIC05
	JRST TCIC08
TCIC06:	LDB UTIL,TCIPBP
	JUMPE UTIL,TCIC07
	MOVEM TCIPCC,@TCIPNF
	AOS TCIPNF
	AOJA TCIMAC,TCIC08
TCIC07:	CAIN TCIMAN,-1
	 SETO TCIMAN,
	CAIE TCIMAN,-1
	 HRRZI TCIMAN,(TCIPCC)
TCIC08:	ADD TCIPBP,3(TCIACB)
	AOJ TCIPCC,
	CAME TCIPCC,1(TCIACB)
	 JRST TCIC03
	CAIE TCIO,12
	 CAIN TCIO,37
	  JRST TCIC09
	CAIN TCIO," "
	 JRST TCIC09
	CAIE TCIO,175
	 JRST TCIC10
TCIC09:	JUMPL TCIMAN,TCIBAD
	CAIN TCIMAN,-1
	 JRST TCIBAD
	JRST TCIEND
TCIC10:	JUMPE TCIMAC,TCIBAD
	AOJ TCISCC,
	HRLM TCIMAC,TCIPLP(TCISCC)
	IBP TCISBP
	IDPB TCIO,TCIBP
	TBOUT <TCIO>		; ECHO
	JRST TCICHR
TCIBAD:	MOVEI TCIO,"G"-100
	TBOUT <TCIO>
	JRST TCICHR
TCIREP:	TSOUT <CRLF>
	HLRZ UTIL,TCIACB
	TSOUT <(UTIL)>
	HRRZI TCIPCC,(TCISCC)	; OUTPUT LOOP CONTROL = CHARS SO FAR
	MOVE TCIPBP,[440700,,ABUF]
TCIR01:	SOJL TCIPCC,TCICHR
	ILDB TCIO,TCIPBP
	TBOUT <TCIO>
	JRST TCIR01
TCIQUA:	TBOUT <TCIO>		; PRINT "?"
	HLRZ TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
	HRRZ TCIPBP,TCIPLP(TCISCC)
TCIQ01:	TSOUT <CRLF>
	MOVEI TCIO,11
	TBOUT <TCIO>
	MOVE TCITCC,2(TCIACB)
	MOVE TCITLP,(TCIPBP)
	IMUL TCITLP,3(TCIACB)
	ADD TCITLP,(TCIACB)
	HRLI TCITLP,440700
TCIQ02:	ILDB TCIO,TCITLP
	JUMPE TCIO,TCIQ03
	TBOUT <TCIO>
	SOJG TCITCC,TCIQ02
TCIQ03:	AOJ TCIPBP,
	SOJG TCIPCC,TCIQ01
	JRST TCIREP
TCIDEL:	JUMPLE TCISCC,TCIENR	; THERE'S NO CHARACTER TO DELETE
	MOVEI TCIO,"\"
	TBOUT <TCIO>
	LDB TCIO,TCIBP
	TBOUT <TCIO>
	ADD TCIBP,[070000,,0] 	; BACK UP LINE BYTE PTR
	TLNE TCIBP,400000
	 SUB TCIBP,[430000,,1]
	HRRZ UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
	MOVEM UTIL,TCIPNF
	ADD TCISBP,[070000,,0]		; BACK UP SCAN BYTE PTR
	TLNE TCISBP,400000
	 SUB TCISBP,[430000,,1]
	SOJA TCISCC,TCICHR
TCIENR:	TSOUT <[ASCIZ/XXX/],CRLF>
	SETZ FLAG,
	RETURN
TCIENN:	SETZ FLAG,
	RETURN SKIP,1
TCIEND:	MOVE TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
	MOVE TCITLP,(TCITLP)
	IMUL TCITLP,3(TCIACB)
	ADD TCITLP,(TCIACB)
	HRLI TCITLP,440700
	SETZ TCITCC,
TCIE01:	IBP TCITLP
	AOJ TCITCC,
	CAIE TCITCC,(TCISCC)
	 JRST TCIE01
TCIE02:	AOJ TCITCC,
	CAMLE TCITCC,2(TCIACB)
	 JRST TCIE03
	ILDB TCIMAC,TCITLP
	JUMPE TCIMAC,TCIE03
	TBOUT <TCIMAC>
	JRST TCIE02
TCIE03:	MOVE TCITLP,TCIPLP(TCISCC)
	MOVE FLAG,(TCITLP)
	ADDI FLAG,4(TCIACB)
	MOVE FLAG,(FLAG)
	ENDR SKIP,2
;$TSIN$ TSICHR TSIBAD TSIREP TSIR01 TSIDEL TSIENR TSIEND

; TERMINAL STRING INPUT
;   IN: IO -- POINTER TO BUFFER,,SIZE OF BUFFER
;	UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
;   OUT: IO -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
;        UTIL -- COUNT OF CHARACTERS
;
$TSIN$:	BEGINR <BP,R10,R11,R12>
	MOVE R10,IO
	MOVE R11,UTIL
	HLRZ BP,IO
	HRLI BP,440700
	SETZ UTIL,
TSICHR:	TBIN <IO>
	CAIN IO,"R"-100
	 JRST TSIREP
	CAIE IO,177
	 CAIN IO,"A"-100
	  JRST TSIDEL
	CAIE IO,"U"-100
	 CAIN IO,"X"-100
	  JRST TSIENR
	CAIN IO,15
	 JRST TSICHR
	CAIE IO,12
	 CAIN IO,175
	  JRST TSIEND
	CAIN IO,37
	 JRST TSIEND
	CAIL IO," "
	 CAIL UTIL,(R10)
	  JRST TSIBAD
	IDPB IO,BP
	ADDI UTIL,1
	JUMPL R11,TSICHR
	TBOUT <IO>
	JRST TSICHR
TSIBAD:	MOVEI IO,"G"-100
	TBOUT <IO>
	JRST TSICHR
TSIREP:	TSOUT <CRLF>
	TSOUT <(R11)>
	JUMPL R11,TSICHR
	HRRZI IO,(BP)
	HLR R12,R10
	CAIGE IO,(R12)
	 JRST TSICHR
	HRLI R12,440700
TSIR01:	CAMN R12,BP
	 JRST TSICHR
	ILDB IO,R12
	TBOUT <IO>
	JRST TSIR01
TSIDEL:	JUMPE UTIL,TSIENR
	MOVEI IO,"\"
	TBOUT <IO>
	LDB IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	SUBI UTIL,1
	JUMPL R11,TSICHR
	TBOUT <IO>
	JRST TSICHR
TSIENR:	TSOUT <[ASCIZ/XXX/],CRLF>
	SETO IO,
	SETZ UTIL,
	RETURN
TSIEND:	SETZ R12,
	IDPB R12,BP
	ENDR SKIP,1
;$TNIN$ TNICHR TNIBAD TNIREP TNIR01 TNIDEL TNIENR TNIEND TNICAL

; TERMINAL NUMBER INPUT
;   IN: IO -- POINTER TO ↑R TEXT,,RADIX
;   OUT: IO -- NUMBER
;
$TNIN$:	BEGINR <BP,UTIL,FLAG>
	MOVE UTIL,IO
	MOVE BP,[440700,,UBUF1]
	SETZ FLAG,
TNICHR:	TBIN <IO>
	CAIN IO,"R"-100
	 JRST TNIREP
	CAIE IO,177
	 CAIN IO,"A"-100
	  JRST TNIDEL
	CAIE IO,"U"-100
	 CAIN IO,"X"-100
	  JRST TNIENR
	CAIN IO,15
	 JRST TNICHR
	CAIE IO,12
	 CAIN IO,175
	  JRST TNIEND
	CAIE IO,37
	 CAIN IO," "
	  JRST TNIEND
	CAIL IO,"0"
	 CAIL IO,"0"(UTIL)
	  JRST TNIBAD
	CAILE FLAG,12		; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
	 JRST TNIBAD
	IDPB IO,BP
	TBOUT <IO>
	AOJA FLAG,TNICHR
TNIBAD:	MOVEI IO,"G"-100
	TBOUT <IO>
	JRST TNICHR
TNIREP:	TSOUT <CRLF>
	HLRZ IO,UTIL
	TSOUT <(IO)>
	HRRZI IO,(BP)
	CAIGE IO,UBUF1
	 JRST TNICHR
	MOVE IO,[440700,,UBUF1]
TNIR01:	CAMN IO,BP
	 JRST TNICHR
	ILDB X1,IO
	TBOUT <X1>
	JRST TNIR01
TNIDEL:	JUMPE FLAG,TNIENR
	MOVEI IO,"\"
	TBOUT <IO>
	LDB IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	TBOUT <IO>
	SOJA FLAG,TNICHR
TNIENR:	TSOUT <[ASCIZ/XXX/],CRLF>
	SETZ IO,
	RETURN
TNIEND:	SETZ IO,
	IDPB IO,BP
	MOVE BP,[440700,,UBUF1]
	MOVEI FLAG,(UTIL)
TNICAL:	ILDB UTIL,BP
	JUMPE UTIL,RETN(1)
	IMULI IO,(FLAG)
	SUBI UTIL,"0"
	ADDI IO,(UTIL)
	JRST TNICAL
	ENDR
;DCNIN DCNIN1 DCNIN2

; DCNIN -- DATACOMPUTER NUMBER INPUT
;   OUT: IO -- 36-BIT MAGNITUDE INTEGER
;
DCNIN:	BEGINR <<IO+1>,UTIL>
	SETZ IO,
DCNIN1:	DCBIN <UTIL>
	CAIL UTIL,"0"
	 CAILE UTIL,"9"
	  RETURN
	JUMPL IO,DCNIN2
	MULI IO,↑D10
	CAILE IO,1
	 JRST DCNIN2
	CAIN IO,1
	 TLO <IO+1>,400000
	MOVE IO,<IO+1>
	ADDI IO,-"0"(UTIL)
	JRST DCNIN1
DCNIN2:	SETO IO,
	JRST DCNIN1
	ENDR
;$NOUT$ NOUT1 NOUT2 NOUT3

; $NOUT$ -- INTEGER OUTPUT
;   IN: X1 -- INTEGER
;       X2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$:	BEGINR <FLAG>
	MOVE FLAG,X2
	MOVE X3,[440700,,UBUF1]
	MOVEI X4,1
	JUMPGE X1,NOUT1
	LSHC X1,-↑D35
	LSH X2,-1
	DIVI X1,(FLAG)
	CAIA
NOUT1:	 IDIVI X1,(FLAG)
	ADDI X2,"0"
	IDPB X2,X3
	SKIPE X1
	 AOJA X4,NOUT1
	SKIPA X1,[440700,,UBUF2]
NOUT2:	ADD X3,[070000,,0]
	TLNE X3,400000
	 SUB X3,[430000,,1]
	LDB X2,X3
	IDPB X2,X1
	SOJG X4,NOUT2
	IDPB X4,X1
	SKIPL FLAG
	 JRST NOUT3
	DCSOUT <UBUF2>
	RETURN
NOUT3:	TSOUT <UBUF2>
	ENDR
;GETFIL GETDAT GETD1 GETD2 GETD3 GETD4 NETEIT

; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR <IO,UTIL>
	MSTIME X1,
	IDIVI X1,↑D1000
	MOVEM X1,NTIME
	MOVE IO,[-GET$F,,FBUF]
	CALLR NUTFB
	 RETURN
	MOVEI IO,GET$F
	MOVEM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<FBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[GET$E,,EBUF]
	CALLR NUTFB
	MOVEI IO,GET$E
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<EBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[GET$D,,ABUF]
	CALLR NUTFB
	MOVEI IO,GET$D
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<ABUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[440700,,ABUF]
	CALLR LUTTSN
	DPB IO,[001400,,LFILE+2]
	LSH IO,-14
	DPB IO,[170300,,LFILE+1]
	DPB UTIL,[141300,,LFILE+2]
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	SKIPLE X1
	 MOVE X1,LFCHAS
	MOVMS X1
	DPB X1,[270400,,LFILE+2]
	ENDR SKIP,1

; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT:	BEGINR <IO,UTIL,FLAG>
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE FLAG,ABUF
	JUMPE FLAG,GETD2
	ADDM FLAG,NSUM
	AOS NSIZE
	ADDM FLAG,NSIZE
	SETZ UTIL,
	SKIPE FLAGFE
	 JRST GETD3
GETD1:	SOSG DDIBUF+2
	 IN DDCHAN,
	  CAIA
	   THUD
	ILDB IO,DDIBUF+1
	ADD UTIL,IO
	SOSG LFOBUF+2
	 OUT LFCHAN,
	  CAIA
	   THUD
	IDPB IO,LFOBUF+1
	SOJG FLAG,GETD1
GETD2:	ADDM UTIL,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	CAMN IO,UTIL
	 JRST GETD4
	TSOUT <[ASCIZ/ (File Checksum Error)/],CRLF>
	JRST GETD4
GETD3:	IN DDCHAN,
	 JRST GETD3
GETD4:	MSTIME X1,
	IDIVI X1,↑D1000
	SUBM X1,NTIME
	ENDR

; FATAL NETWORK ERROR MESSAGES
;

NETEIT:	OUTSTR [ASCIZ / ?? Datacomputer closed connection ??/]
	JRST QUIT
;PUTFIL PUTDAT PUTD1 PUTD2A PUTD2B PUTD3 NETEOT

; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR <IO,BP,UTIL>
	OUT DDCHAN,
	 CAIA
	  THUD
	MSTIME X1,
	IDIVI X1,↑D1000
	MOVEM X1,NTIME
	IBP DDOBUF+1
	HRR BP,DDOBUF+1
	HRLI BP,440700
	MOVE UTIL,[440700,,FBUF]
	SCOPY (UTIL,BP)
	MOVE BP,UTIL
	MOVE UTIL,[440700,,EBUF]
	SCOPY (UTIL,BP)
	MOVE BP,UTIL
	LDB IO,[001400,,LFILE+2] ; CREATION DATE
	LDB UTIL,[170300,,LFILE+1]
	LSH UTIL,14
	IORI IO,(UTIL)
	LDB UTIL,[141300,,LFILE+2] ; CREATION TIME
	CALLR LUTTNS
	DATE IO,
	MSTIME X1,
	IDIVI X1,<↑D1000*↑D60>
	MOVE UTIL,X1
	CALLR LUTTNS
	HRLI BP,004400
	MOVE UTIL,VBUF
	IDPB UTIL,BP
	CALLR LOCS
	IDPB IO,BP
	LDB UTIL,[270400,,LFILE+2] ; DATA MODE
	MOVNS UTIL
	IDPB UTIL,BP
	HRRO X1,DDOBUF+1
	MOVEM BP,DDOBUF+1
	SUBI BP,-1(X1)
	HRRZM BP,NSIZE
	TLC X1,-1(BP)
	SETZ UTIL,
	ADD UTIL,(X1)
	AOBJN X1,.-1
	ADDM UTIL,NSUM
	OUT DDCHAN,
	 CAIA
	  THUD
	ENDR

; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT:	BEGINR <IO,UTIL>
	CALLR LOCS
	AOS NSIZE
	ADDM IO,NSUM
	ADDM IO,NSIZE
	AOS DDOBUF+1
	MOVEM IO,@DDOBUF+1
	OUT DDCHAN,
	 CAIA
	  THUD
	SETZ UTIL,
	JRST PUTD2B

PUTD1:	ILDB X1,LFIBUF+1
	ADD UTIL,X1
	SOSLE DDOBUF+2
	 JRST PUTD2A
	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD3
	MOVE X1,X1SAVE#
	OUT DDCHAN,
	 JRST PUTD2A
	THUD
PUTD2A:	IDPB X1,DDOBUF+1
PUTD2B:	SOSG LFIBUF+2
	 IN LFCHAN,
	  JRST PUTD1
	AOS NSIZE
	ADDM UTIL,NSUM
	ADDM UTIL,NSUM
	AOS DDOBUF+1
	MOVEM UTIL,@DDOBUF+1
	OUT DDCHAN,
	 CAIA
	  THUD
PUTD3:	MSTIME X1,
	IDIVI X1,↑D1000
	SUBM X1,NTIME
	ENDR

; FATAL NETWORK ERROR MESSAGES
;

NETEOT:	OUTSTR [ASCIZ / ?? Datacomputer has crashed ??/]
	JRST QUIT
;EXAFIL EXAF5 EXAF6 EXAF0 EXAF1 EXAF2 EXAF3

; EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
;
EXAFIL:	BEGINR <IO,BP,FLAG,UTIL>
	MSTIME X1,
	IDIVI X1,↑D1000
	MOVEM X1,NTIME
	MOVE IO,[-GET$F,,FBUF]
	CALLR NUTFB
	 RETURN
	MOVEI IO,GET$F
	MOVEM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<FBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[GET$E,,EBUF]
	CALLR NUTFB
	MOVEI IO,GET$E
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<EBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[GET$D,,ABUF]
	CALLR NUTFB
	MOVEI IO,GET$D
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<ABUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE FLAG,ABUF
	JUMPE FLAG,EXAF2
	ADDM FLAG,NSUM
	AOS NSIZE
	ADDM FLAG,NSIZE
	SKIPL DEXA$S
	 JRST EXAF0
	MOVE X2,[440700,,FBUF]
EXAF5:	ILDB X1,X2
	CAILE X1," "
	 JRST EXAF5
	SETZ X1,
	DPB X1,X2
	MOVE X2,[440700,,EBUF]
EXAF6:	ILDB X1,X2
	CAILE X1," "
	 JRST EXAF6
	SETZ X1,
	DPB X1,X2
	TSOUT <[ASCIZ/ [/],FBUF,[ASCIZ/./],EBUF,[ASCIZ/]/],CRLF>
EXAF0:	SETZ UTIL,
EXAF1:	HRLI IO,(FLAG)
	CAIL FLAG,SIZBLK
	 HRLI IO,SIZBLK
	HRRI IO,EXABUF
	CALLR NUTFB
	MOVEI IO,(FLAG)
	CAILE IO,SIZBLK
	 MOVEI IO,SIZBLK
	SUBI FLAG,(IO)
	HRLOI X1,-1(IO)
	EQVI X1,EXABUF
	PUSH STAK,X1
	IMULI IO,5
	MOVE BP,[440700,,EXABUF]
	CALLR DEXA$
	POP STAK,X1
	ADD UTIL,(X1)
	AOBJN X1,.-1
	JUMPG FLAG,EXAF1
EXAF2:	ADDM UTIL,NSUM
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	MOVE IO,[1,,ABUF]
	CALLR NUTFB
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	CAMN IO,UTIL
	 JRST EXAF3
	TSOUT <[ASCIZ/ (File Checksum Error)/],CRLF>
EXAF3:	MSTIME X1,
	IDIVI X1,↑D1000
	SUBM X1,NTIME
	ENDR SKIP,1
;ICP ICPLUZ SUICID QUIT QUIT1 CLSCHK

; ICP -- CONNECT TO DC
; BOY IS THIS ICP ROUTINE EVER A LOSER!!  -- MRC

ICP:	BEGINR	<IO,UTIL,FLAG>
	INIT DCCHAN,17
	 SIXBIT /IMP/
	 0
	 JRST ICPLUZ
	SETZM CONECB
	SETOM CONECB+LSLOC	; GENSYM LOCAL SOCKET
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X3,↑D32
	MOVEM X3,CONECB+BSLOC
	MOVEI X3,DCSOKT
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 2,24,0,12,12
		]		; TIME OUT CLS, RFNM, RFC, AND INPUT
	MTAPE DCCHAN,CONECB
	MOVE X2,CONECB+LSLOC
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; NO CONNECTION TO LOGGER
	INPUT DCCHAN,[IOWD 1,FRS#
		0]
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
	MOVE X3,FRS
	LSH X3,-4
	MOVEM X3,FRS
	ADDI X3,1
	MOVEM X3,FSS#
	ADDI X2,3
	MOVEM X2,LSS#
	SUBI X2,1
	MOVEM X2,LRS#
	MOVE X1,CONECB+LSLOC
	MOVEM X1,TERBLK+LSLOC
	MTAPE DCCHAN,TERBLK	; RELEASE LOGGER
	INIT DCCHAN,1
	SIXBIT /IMP/
	XWD DCOBUF,DCIBUF
	 JRST ICPLUZ
	MTAPE DCCHAN,[	↑D15
			BYTE (6) 5,24,0,12,0]	; TIME OUT CLS, RFNM, AND RFC
	INBUF DCCHAN,
	OUTBUF DCCHAN,
	MOVEI X1,↑D8
	DPB X1,[300600,,DCIBUF+1]
	DPB X1,[300600,,DCOBUF+1]
	MOVEM X2,CONECB+LSLOC
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETZM CONECB+WFLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MOVE X3,FSS
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO RECEIVE SIDE
	CALLR CLSCHK		; SEE IF WE ARE REALLY OPEN
	 JRST ICPLUZ
	AOS CONECB+LSLOC
	SOS CONECB+FSLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO SEND SIDE
	CALLR CLSCHK
	 JRST ICPLUZ
	MOVEI X3,4
	MOVEM X3,CONECB
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ
	SOS CONECB+LSLOC
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,[	15		;ALLOCATE
			1]
	ENDR

; HERE WHEN CONNECTION FAILS

ICPLUZ:	OUTSTR [ASCIZ/The Datacomputer is unavailable right now.  Try again later./]
SUICID:	RESET
	EXIT

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	MOVEI IO,"Z"-100
	IDPB IO,DCOBUF+1
	OUTPUT DCCHAN,
QUIT1:	SOSG DCIBUF+2
	 IN DCCHAN,
	  CAIA
	   JRST SUICID
	ILDB DCIBUF+1
	SKIPE FLAGDD
	 OUTCHR
	JRST QUIT1

; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME

CLSCHK:	BEGINR
	MTAPE DCCHAN,STTBLK
	MOVE X1,STTBLK+1
	IOR X1,STTBLK+2
	STATO DCCHAN,ERRBTS
	TLNN X1,060000
	 RETURN SKIP,1
	ENDR
;NETOI NETOI2 NETOO NETOO2 NETC

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	MTAPE DDCHAN,[	15		;ALLOCATE
			1]
	SETZM CONECB
	MOVE X1,LRS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FSS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOI2
	RETURN SKIP,1
NETOI2:	OUTSTR	[ASCIZ / ?? Network connection OPEN failure with status /]
	GETSTS DDCHAN,IO
	TNOUT (IO,10)
	OUTSTR [ASCIZ / ??
/]
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	SETZM CONECB
	MOVE X1,LSS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FRS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOO2
	UOUTBF DDCHAN,[	2
			4000]
	RETURN SKIP,1
NETOO2:	OUTSTR [ASCIZ / ?? Network connection OPEN failure with status /]
	GETSTS DDCHAN,IO
	TNOUT (IO,10)
	OUTSTR [ASCIZ / ??
/]
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	CLOSE DDCHAN,
	ENDR
;NETMSG NETMS1 NETM1A NETMS2 NETMS3 NETMS4

; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR	<IO>
	SKIPE FLAGSM			; NETMSG allowed to gobble?
	 RETURN SKIP,1			; no!!
NETMS1:	MOVE IO,DCIBUF+2		; check for cruft read but still
	CAILE IO,20			;  not input by dftp
	 JRST NETM1A			; stuff in buffer still
	HRRZ IO,DCIBUF			; try another buffer
	HRRZ IO,(IO)
	SKIPGE (IO)
	 JRST NETM1A
	MTAPE DCCHAN,[10]		; try still in monitor
	 RETURN	SKIP,1
NETM1A:	DCBIN <IO>
	CAIN IO,"?"
	 JRST DEATH
	CAIN IO,"!"
	 JRST NETMS2
	CAIE IO,"+"
	 CAIN IO,"-"
	  JRST NETMS3
	CAIN IO,"."
	 JRST NETMS4
	CALLR RENLIN
	JRST NETMS1
NETMS2:	CALLR RENLIP
	JRST NETMS1
NETMS3:	CALLR RENLIP
	RETURN
NETMS4:	SETOM FLAGSM
	CALLR RENLIN
	ENDR SKIP,1
;NETFFI NETFI1 NETFI4 NETFI2 NETFI5

; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI:	BEGINR
	SETO X1,
	CAME X1,FSBUF
	 CAMN X1,ESBUF
	  CAIA
	   JRST	NETFI1
	TSOUT <[ASCIZ/ (/],LUTDSF,RPAREN>
NETFI1:	SKIPN GBUF1
	 JRST NETFI2
	MOVE X1,[440600,,LFILE]
	MOVEI X2,6
	MOVE X3,[440700,,FBUF]
NETFI4:	ILDB X4,X1
	SKIPE X4
	 ADDI X4,40
	IDPB X4,X3
	SOJG X2,NETFI4
NETFI2:	SKIPN GBUF2
	 RETURN
	MOVE X1,[440600,,LFILE+1]
	MOVEI X2,3
	MOVE X3,[440700,,EBUF]
NETFI5:	ILDB X4,X1
	SKIPE X4
	 ADDI X4,40
	IDPB X4,X3
	SOJG X2,NETFI5
	ENDR
;NUTMI NUTMO NUTMOB NUTMOL NUTMOO NUTDD NUTDDL NETDSI NETDSO NUTFB NUTFB1 NUTFB2

; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN DCCHAN,
	 CAIA
	  JRST NETEIT
	SKIPE FLAGDD
	 CALLR NUTDD
	ENDR

; NETWORK UTILITY -- MESSAGE OUTPUT
;   IN: X1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO:	BEGINR <IO,BP>
	SKIPE FLAGDD
	 OUTSTR (X1)
	MOVEI BP,(X1)
	TLOA BP,440700
NUTMOB:	 IDPB IO,DCOBUF+1
	ILDB IO,BP
	JUMPE IO,RETN(0)
NUTMOL:	SOSL DCOBUF+2
	 JRST NUTMOB
NUTMOO:	OUT DCCHAN,
	 JRST NUTMOL
	JRST NETEOT
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD:	BEGINR <IO,UTIL>
	MOVE X1,DCIBUF+1
	MOVE UTIL,DCIBUF+2
NUTDDL:	SOJL UTIL,RETN(0)
	ILDB IO,X1
	JUMPE IO,NUTDDL
	TBOUT IO
	JRST NUTDDL
	ENDR

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;   OUT: UTIL
;
NETDSI:	BEGINR
	MOVE UTIL,LRS
	ADDI UTIL,2
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;   OUT: UTIL
;
NETDSO:	BEGINR
	MOVE UTIL,LSS
	ADDI UTIL,2
	ENDR

; NETWORK UTILITY -- FILL A DESIGNATED BUFFER
;   IN: IO -- SIZE OF BUFFER (- IF EOF POSSIBLE),,ADDRESS OF BUFFER
;
NUTFB:	BEGINR
	SKIPGE X1,IO
	 JRST NUTFB1
	HLRZ X1,IO
	MOVNS X1
	HRLS X1
	HRR X1,IO
NUTFB1:	SOSG DDIBUF+2
	 IN DDCHAN,
	  JRST NUTFB2
	SKIPGE IO
	 STATO	DDCHAN,020000
	  THUD
	RETURN
NUTFB2:	ILDB X2,DDIBUF+1
	MOVEM X2,(X1)
	AOBJN X1,NUTFB1
	SKIPL IO
	 RETURN
	ENDR SKIP,1
;LOCOI LOCOI2 LOCOO LOCOO1 LOCOO2 LOCC LOCS

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR <IO>
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3	; MUST SETUP FOR SAIL PPN'S
	LOOKUP LFCHAN,LFILE	; PREPARE FILE FOR INPUT
	 JRST LOCOI2
	RETURN SKIP,1
LOCOI2:	OUTSTR [ASCIZ / (Local file not found)
/]
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR <IO,<IO+1>>
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3	; MUST SETUP FOR SAIL PPN'S
	DMOVE IO,<LFILE+1>
	LOOKUP LFCHAN,LFILE
	 JRST LOCOO1
	CLOSE LFCHAN,
	TAIN <[ASCIZ / [Old Local File][Confirm]/]>
	 RETURN
	 RETURN
LOCOO1:	DMOVEM IO,<LFILE+1>
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3
	ENTER LFCHAN,LFILE	; PREPARE FILE FOR OUTPUT
	 JRST LOCOO2
	RETURN SKIP,1
LOCOO2:	OUTSTR [ASCIZ/ (Local file creation failure)
/]
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	SKIPE FLAGFE
	 RETURN
	CLOSE LFCHAN,
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: IO -- SIZE IN WORDS
;
LOCS:	BEGINR
	MOVS IO,LFILE+3		; - LENGTH
	MOVNS IO		; + LENGTH
	ENDR
;LOCFFI LOCFI1 LOCFI6 LOCFI2 LOCFI7 LOCFI8 LOCFI3 LOCFI9 LCFI12 LCFI10 LCFI11 LOCFI4 LOCFI5 LOCNFI LOCNI0 LOCNI1 LOCNI6 LOCNI7 LOCNI2 LOCNI8 LOCNI9 LCNI10 LCNI11 LOCNI3 LCNI12 LOCNI4 LCNI13

; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR <IO>
	SETZM GBUF1
	LDB X1,[350700,,FBUF]
	CAIN X1,"*"
	 SETOM GBUF1
	SETZM GBUF2
	LDB X1,[350700,,EBUF]
	CAIN X1,"*"
	 SETOM GBUF2
	SETO X1,
	CAME X1,FSBUF
	 CAMN X1,ESBUF
	  CAIA
	   JRST LOCFI5
	SETZM LUTDSP
LOCFI1:	CALLR LUTDS
	 CAIA
	  JRST LOCFI6
	OUTSTR [ASCIZ/ (No such file)
/]
	RETURN
LOCFI6:	SETO X1,
	CAME X1,FSBUF
	 JRST LOCFI2
	CAME X1,ESBUF
	 JRST LOCFI3
	JRST LOCFI4
LOCFI2:	MOVE X1,[440700,,FSBUF]
	MOVE X2,[440700,,LUTDSF]
LOCFI7:	ILDB X3,X1
	ILDB X4,X2
	JUMPE X3,LOCFI8
	CAIN X3,(X4)
	 JRST LOCFI7
	JRST LOCFI1
LOCFI8:	JUMPE X4,LOCFI4
	CAIN X4,"."
	 JRST LOCFI4
	JRST LOCFI1
LOCFI3:	MOVE X1,[440700,,ESBUF]
	MOVE X2,[440700,,LUTDSF]
LOCFI9:	ILDB X4,X2
	JUMPE X4,LCFI10
	CAIE X4,"."
	 JRST LOCFI9
LCFI12:	ILDB X4,X2
LCFI10:	ILDB X3,X1
	JUMPE X3,LCFI11
	CAIN X3,(X4)
	 JRST LCFI12
	JRST LOCFI1
LCFI11:	JUMPE X4,LOCFI4
	JRST LOCFI1
LOCFI4:	HRRZI IO,LUTDSF
	CALLR LUTFN
LOCFI5:	CALLR LOCOI
	 RETURN
	CALLR LOCC
	ENDR SKIP,1

; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR <IO>
	CALLR LOCC
	SETO X1,
	CAME X1,FSBUF
	 CAMN X1,ESBUF
LOCNI0:	  CALLR	LUTDS
	   RETURN SKIP,1
	SETO X1,
	CAME X1,FSBUF
	 JRST LOCNI1
	CAME X1,ESBUF
	 JRST LOCNI2
	JRST LOCNI3
LOCNI1:	MOVE X1,[440700,,FSBUF]
	MOVE X2,[440700,,LUTDSF]
LOCNI6:	ILDB X3,X1
	ILDB X4,X2
	JUMPE X3,LOCNI7
	CAIN X3,(X4)
	 JRST LOCNI6
	JRST LOCNI0
LOCNI7:	JUMPE X4,LOCNI3
	CAIN X4,"."
	 JRST LOCNI3
	JRST LOCNI0
LOCNI2:	MOVE X1,[440700,,ESBUF]
	MOVE X2,[440700,,LUTDSF]
LOCNI8:	ILDB X4,X2
	JUMPE X4,LCNI10
	CAIE X4,"."
	 JRST LOCNI8
LOCNI9:	ILDB X4,X2
LCNI10:	ILDB X3,X1
	JUMPE X3,LCNI11
	CAIN X3,(X4)
	 JRST LOCNI9
	JRST LOCNI0
LCNI11:	JUMPE X4,LOCNI3
	JRST LOCNI0
LOCNI3:	HRRZI IO,LUTDSF
	CALLR LUTFN
	CALLR LOCOI
	 JRST LOCNI0
	TSOUT <[ASCIZ/ (/],LUTDSF,RPAREN>
	SKIPN GBUF1
	 JRST LOCNI4
	MOVE X1,[440600,,LFILE]
	MOVEI X2,6
	MOVE X3,[440700,,FBUF]
LCNI12:	ILDB X4,X1
	SKIPE X4
	 ADDI X4,40
	IDPB X4,X3
	SOJG X2,LCNI12
LOCNI4:	SKIPN GBUF2
	 RETURN
	MOVE X1,[440600,,LFILE+1]
	MOVEI X2,3
	MOVE X3,[440700,,EBUF]
LCNI13:	ILDB X4,X1
	SKIPE X4
	 ADDI X4,40
	IDPB X4,X3
	SOJG X2,LCNI13
	ENDR
;LOCNFO LOCNO0

; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR <IO>
	SETZ X1,
	SETO X2,
	CAMN X2,FSBUF
	 TRO X1,400000
	CAMN X2,ESBUF
	 TRO X1,200000
	JUMPE X1,RETN(0)
	MOVE X2,[440700,,ABUF]
	MOVE X3,[440700,,FSBUF]
	TRNE X1,400000
	 HRRI X3,FBUF
	ILDB X4,X3
	CAIN X4," "
	 SETZ X4,
	IDPB X4,X2
	JUMPN X4,.-4
	SKIPN ESBUF
	 JRST LOCNO0
	MOVEI X4,"."
	DPB X4,X2
	MOVE X3,[440700,,ESBUF]
	TRNE X1,200000
	 HRRI X3,EBUF
	ILDB X4,X3
	CAIN X4," "
	 SETZ X4,
	IDPB X4,X2
	JUMPN X4,.-4
LOCNO0:	MOVEI IO,ABUF
	CALLR LUTFN
	TSOUT <[ASCIZ/ (/],ABUF,RPAREN>
	ENDR
;LUTFN LUTFN1 LUTFN2 LUTFNT

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR <IO,BP,UTIL>
	HRRI BP,(IO)
	HRLI BP,440700
	SETZM LFILE		; CLEAR OLD FILE NAME
	SETZM LFILE+1		;   AND EXTENSION
	SETZM LFILE+2
	SETZM LFILE+3
	MOVEI X1,LUTFNT		; INITIALIZE XCT PNTR
	MOVEI X2,LFILE		; SET DESTINATION OF IOR
	SETZ UTIL,
LUTFN1:	ILDB IO,BP
	JUMPE IO,RETN(0)
	CAIN IO,"."		; PREPARE FOR FILE EXTENSION IF "."
	 JRST LUTFN2
	CAILE UTIL,5
	 JRST LUTFN1
	ADDI IO,40		; CONVERT TO SIXBIT BY ADDITION
	ANDI IO,77		;   AND REMOVAL OF HIGH BITS
	XCT (X1)		; EXECUTE THE PROPER ROTATE
	IORM IO,(X2)		; IOR RESULT INTO FILE OR FILE+1
	AOJ X1,			; INCREMENT THE XCT PNTR
	AOJA UTIL,LUTFN1
LUTFN2:	CAIN X2,LFILE+1
	 JRST RETN(0)		; IGNORE MULTIPLE EXTENSIONS
	MOVEI X1,LUTFNT		; RESET PNTRS FOR EXTENSION
	MOVEI X2,LFILE+1
	MOVEI UTIL,3
	JRST LUTFN1
LUTFNT:	ROT IO,-6		; HIGH ORDER
	ROT IO,-14
	ROT IO,22
	ROT IO,14
	ROT IO,6
	ROT IO,0		; LOW ORDER
	ENDR
;LUTDS LUTDS1 LUTDS2 LUTDS3 LUTDSI LUTDSS LUTDSD LUTDSE

; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS:	BEGINR
	SKIPN LUTDSP
	 JRST LUTDSS
LUTDS1:	JSP X1,LUTDSI
	JUMPE X2,[	JSP X1,LUTDSI
			REPEAT ↑D14,<JSP X1,LUTDSI>
			JRST LUTDS1]	; IGNORE HOLES IN DIRECTORY
	MOVE X3,[440700,,LUTDSF]
LUTDS2:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS2
	MOVEI X1,"."
	IDPB X1,X3
	JSP X1,LUTDSI
	ANDCMI X2,-1
LUTDS3:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS3
	SETZ X1,
	IDPB X1,X3
REPEAT ↑D14,<JSP X1,LUTDSI>		;IGNORE EXTRA SAIL UFD CRUFT
	RETURN	SKIP,1
LUTDSI:	SOSG LDIBUF+2
	 IN LDCHAN,
	  CAIA
	   JRST LUTDSD
	ILDB X2,LDIBUF+1
	JRST (X1)
LUTDSS:	RELEAS LDCHAN,
	MOVE X1,LFIPPN
	MOVEM X1,LDIR
	MOVE X1,LFCHAS+1
	MOVEM X1,LDCHAS+1
	MOVE X1,[SIXBIT/UFD/]
	MOVEM X1,LDIR+1
	SETZM LDIR+2
	MOVE X1,[SIXBIT/  1  1/]
	MOVEM X1,LDIR+3
	OPEN LDCHAN,LDCHAS
	 JRST LUTDSE
	LOOKUP LDCHAN,LDIR
	 JRST LUTDSE
	SETOM LUTDSP
	JRST LUTDS1
LUTDSD:	STATO LDCHAN,20000
LUTDSE:	 OUTSTR	[ASCIZ/ ?? Local directory failure ??
/]
	RELEAS LDCHAN,
	ENDR
;LUTTNS

; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
;   IN: IO -- DATE INTEGER
;	UTIL -- TIME INTEGER
;	BP -- BYTE POINTER TO DESTINATION STRING
;   OUT: BP -- UPDATED BYTE POINTER
;
LUTTNS: BEGINR
	MOVE X1,IO
	IDIVI X1,↑D31
	MOVEI X3,(X1)
	MOVEI X1,1(X2)
	IDIVI X1,↑D10
	ADDI X1,"0"
	ADDI X2,"0"
	IDPB X1,BP
	IDPB X2,BP
	MOVEI X1,"-"
	IDPB X1,BP
	MOVEI X1,(X3)
	IDIVI X1,↑D12
	MOVEI X3,(X1)
	HRRI X1,LUTTM(X2)
	HRLI X1,440700
	SCOPY (X1,BP)
	MOVEI X1,"-"
	IDPB X1,BP
	MOVEI X1,↑D64(X3)
	IDIVI X1,↑D10
	ADDI X1,"0"
	ADDI X2,"0"
	IDPB X1,BP
	IDPB X2,BP
	MOVEI X1," "
	IDPB X1,BP
	MOVE X1,UTIL
	IDIVI X1,↑D60
	MOVEI X3,(X2)
	IDIVI X1,↑D10
	ADDI X1,"0"
	ADDI X2,"0"
	IDPB X1,BP
	IDPB X2,BP
	MOVEI X1,":"
	IDPB X1,BP
	MOVEI X1,(X3)
	IDIVI X1,↑D10
	ADDI X1,"0"
	ADDI X2,"0"
	IDPB X1,BP
	IDPB X2,BP
	SETZ X1,
	IDPB X1,BP
	ENDR
;LUTTSN LUTTM

; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
;   IN: IO -- ADDRESS OF TIME STRING
;   OUT: IO -- DATE INTEGER
;	 UTIL -- TIME INTEGER
;
LUTTSN:	BEGINR <BP>
	MOVE BP,IO
	SETZ IO,
	SETZ UTIL,
	ILDB X1,BP
	CAIL X1,"0"
	 CAILE X1,"9"
	  RETURN
	MOVEI X4,-"0"(X1)
	IMULI X4,↑D10
	ILDB X1,BP
	ADDI X4,-"0"(X1)
	ILDB X1,BP
	CAIE X1,"-"
	 RETURN
	MOVE X3,[440700,,X2]
	SETZ X2,
	ILDB X1,BP
	IDPB X1,X3
	ILDB X1,BP
	IDPB X1,X3
	ILDB X1,BP
	IDPB X1,X3
	MOVEI X3,↑D11
	IOR X2,[1004,,0]	; CANONICALIZE CASES
	CAME X2,LUTTM(X3)
	 SOJGE X3,.-1
	JUMPL X3,RETN(0)
	ILDB X1,BP
	CAIE X1,"-"
	 RETURN
	ILDB X1,BP
	MOVEI X2,-"0"(X1)
	IMULI X2,↑D10
	ILDB X1,BP
	ADDI X2,-"0"(X1)
	SUBI X2,↑D64
	IMULI X2,↑D12
	ADDI X2,(X3)
	IMULI X2,↑D31
	ADDI X2,-1(X4)
	ILDB X1,BP
	CAIE X1," "
	 RETURN
	ILDB X1,BP
	MOVEI X3,-"0"(X1)
	IMULI X3,↑D10
	ILDB X1,BP
	ADDI X3,-"0"(X1)
	IMULI X3,6
	ILDB X1,BP
	CAIE X1,":"
	 RETURN
	ILDB X1,BP
	ADDI X3,-"0"(X1)
	IMULI X3,↑D10
	ILDB X1,BP
	ADDI X3,-"0"(X1)
	MOVE IO,X2
	MOVE UTIL,X3
	ENDR

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM:	ASCII /Jan/
	ASCII /Feb/
	ASCII /Mar/
	ASCII /Apr/
	ASCII /May/
	ASCII /Jun/
	ASCII /Jul/
	ASCII /Aug/
	ASCII /Sep/
	ASCII /Oct/
	ASCII /Nov/
	ASCII /Dec/
;OOPS IOERDD IOERLF

; OOPS -- THE IMPOSSIBLE HAS HAPPENED
;
OOPS:	MOVE IO,[IN DDCHAN,]
	CAMN IO,-3(FLAG)
	 JRST IOERDD
	MOVE IO,[OUT DDCHAN,]
	CAMN IO,-3(FLAG)
	 JRST IOERDD
	MOVE IO,[IN LFCHAN,]
	CAMN IO,-3(FLAG)
	 JRST IOERLF
	MOVE IO,[OUT LFCHAN,]
	CAMN IO,-3(FLAG)
	 JRST IOERLF
	OUTSTR [ASCIZ/ ?? Impossible event at /]
	MOVEI IO,-1(FLAG)
	TNOUT (IO,10)
	OUTSTR [ASCIZ / ??/]
	JRST SUICID
IOERDD:	GETSTS DDCHAN,ABUF
	CAIA
IOERLF:	 GETSTS	LFCHAN,ABUF
	OUTSTR [ASCIZ/ ?? Data error at /]
	MOVEI IO,-3(FLAG)
	TNOUT (IO,10)
	OUTSTR [ASCIZ/ with status /]
	MOVE IO,ABUF
	TNOUT (IO,10)
	OUTSTR [ASCIZ / ??
/]
	SETOM FLAGDE
	CALLR RENDER
	 JRST QUIT
	JRST QUIT
;CRLF RPAREN SEMI DCIBUF DCOBUF DDCHAS ZONKER DDIBUF DDOBUF LFIBUF LFOBUF ZONKEND XJOBFF LFIPPN LFILE LFCHAS LDIR LDCHAS LDIBUF LUTDSP LUTDSF EXABUF CONECB TERBLK STTBLK CMDMOD ANCHOR LOGIN% CONTEX OPENED OPENEM FLAGDD FLAGDE FLAGFE FLAGNN FLAGTT FLAGSM DEXA$L DEXA$P DEXA$S NBUF FBUF EBUF VBUF FSBUF ESBUF ABUF UBUF1 UBUF2 GBUF1 GBUF2 NTIME NSIZE NSUM TCIPCL TCIPLP TCIPNF STSIZ STBEG

SUBTTL Data area

CRLF:	BYTE (7)15,12,0,0,0
RPAREN:	BYTE (7)")",15,12,0,0
SEMI:	BYTE (7)";",15,12,0,0

	LIT			; LITERALS GO HERE

DCIBUF:	BLOCK 3
DCOBUF:	BLOCK 3
DDCHAS:	13			; BINARY
	SIXBIT	/IMP/
	DDOBUF,,DDIBUF

ZONKER==.
DDIBUF:	BLOCK 3
DDOBUF:	BLOCK 3
LFIBUF:	BLOCK 3
LFOBUF:	BLOCK 3
ZONKEND==.-1
XJOBFF:	BLOCK 1

LFIPPN:	0			; PPN
LFILE:	0			; FILE NAME
	0			; EXTENSION AND DATES
	0			; MODE AND DATES
	0			; SIZE IN WORDS
LFCHAS:	13			; BINARY MODE
	SIXBIT	/DSK/
	LFOBUF,,LFIBUF

LDIR:	0			; PROJ-PROG OF USER
	0			; "UFD"
	0
	0			; [1,1]
LDCHAS:	13
	SIXBIT	/DSK/
	0,,LDIBUF
LDIBUF:	BLOCK 3
LUTDSP:	0
LUTDSF:	BLOCK SBSIZE

EXABUF:	BLOCK SIZBLK

CONECB:	BLOCK 7

; OTHER RANDOM THINGS

TERBLK:	3			; TERMINATE BLOCK
	0			; STATUS BITS
	1			; FOREIGN SOCKET LOC
	0			; DON'T WAIT

STTBLK:	2
	BLOCK 2

; * VARIABLES

CMDMOD:	0

ANCHOR:	ASCIZ /DFTP/
	BLOCK <SBSIZE-2>
LOGIN%:	BLOCK LBSIZE
CONTEX:	BLOCK LBSIZE
OPENED:	BLOCK LBSIZE
OPENEM:	0

FLAGDD:	0
FLAGDE:	0
FLAGFE:	0
FLAGNN:	0
FLAGTT:	-1
FLAGSM: 0
DEXA$L:	0
DEXA$P:	0
DEXA$S:	0

; * BLOCKS

NBUF:	BLOCK LBSIZE
FBUF:	BLOCK SBSIZE
EBUF:	BLOCK SBSIZE
VBUF:	0
FSBUF:	BLOCK SBSIZE
ESBUF:	BLOCK SBSIZE

ABUF:	BLOCK SBSIZE
UBUF1:	BLOCK LBSIZE
UBUF2:	BLOCK SBSIZE
GBUF1:	BLOCK LBSIZE
GBUF2:	BLOCK LBSIZE

NTIME:	0
NSIZE:	0
NSUM:	0

TCIPCL:	BLOCK 100		; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP:	0			; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
	BLOCK 37		;   (SIZE = # CHARS IN LARGEST CMD)
TCIPNF:	0			; P(OSSIBLE)N(EXT)F(REE)

	STSIZ==100
STBEG:	BLOCK STSIZ

	VAR

	-1			; CRETIN LINK-10

END DFTP